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