2017-04-20 16 views
0

私は、ショップであるユーザー、注文できるユ​​ーザー、サプライヤーであるユーザーがいるプラットフォームを持ち、注文した注文を表示できます。今、私はサプライヤーがこのLaravelさまざまなユーザータイプの関係

Auth::user()->orders 

しかし、お店でのユーザー操作を行うことができるようにするために私のUserクラスで、たとえば私が好きwoud、いくつかのロジック問題のに実行しているよ

:また、私はここにこれを行う方法の悪い例を示し、この

Auth::user()->orders 

を行うことができるはず

これを行うには、より良い方法がありますか?認証のために

答えて

4

を示唆している、私はあなたのデータモデルを再設計を提案するつもりです。あなたのユーザーモデルはオーセンティケータです。それはまた、店やサプライヤー、または何か他のものであってはなりません。サプライヤとショップは、独自のモデルを使用する必要があります。

あなたが現在行っていることは、S.O.L.I.D.に違反しています。あなたの質問への答えのほとんどはここにあります。拡張のために特にOまたはOpen、変更のために閉じます。たとえば、ユーザーが店舗とサプライヤの場合はどうなりますか?後でラインの下にDistributerタイプを追加するとどうなりますか?あなたはそのモデルに戻り、より多くのif/elseステートメント、より多くの種類の関係などを追加する必要があります。

代わりに、私は「ショップ」と「サプライヤー」の役割を持つと考えています。サプライヤユーザが1人または両方をユーザに割り当てることができるモデル。認証が完了すると、すでにUserオブジェクトが作成されている可能性があります。この時点以降は、そのユーザーに割り当てられたロールに基づいてサービス検索ShopとSupplier情報を使用できます。

基本的な実装のいくつかの簡単なsudoのコード:これは、あなたはまだに決定されている場合は、非常に簡単に、

しかし「ディストリビューター」の役割とDistributerServiceを追加することで、これを拡張することができることを意味し

class ShopService 
{ 
    public function listOrders(User $user) 
    { 
    if ($user->hasRole('shop')) { 
     return Shop::with('orders')->where('user_id', $user->id)->get() 
    } 

    return null; 
    } 
} 

class SupplierService 
{ 
    public function listOrders(User $user) 
    { 
    if ($user->hasRole('supplier')) { 
     return Supplier::with('orders')->where('user_id', $user->id)->get() 
    } 

    return null; 
    } 
} 

少なくとも私はあなたがまだ別のショップとサプライヤーのモデルを持っていること、それぞれがベースのユーザーモデルを拡張し、それぞれに関連する関係を適用することを提案します。例えば

class User extends Authenticatable 
{ 
    ... user stuff 
} 

class Shop extends User 
{ 
    public function orders() 
    { 
     return $this->hasMany(Order::class, 'created_by'); 
    } 
} 

class Supplier extends User 
{ 
    public function orders() 
    { 
     return $this->hasMany(Order::class, 'fulfilled_by'); 
    } 
} 
関連する問題