對於初學者來說,我會建議你重新設計你的數據模型。您的用戶模型是您的身份驗證器,這就是它應該關注的一切。它不應該也是一個商店或供應商,或其他任何東西。供應商和商店應該是獨立的模型,它們擁有「用戶」。
你此刻在做什麼違反S.O.L.I.D.正如你在這裏的問題的大部分答案一樣。特別是O或Open for extension,關閉以進行修改。例如,如果用戶是商店和供應商?如果稍後再添加分配器類型,該怎麼辦?你必須回到那個模型,並添加更多的if/else語句,更多類型的關係等等等等...的
相反,我會考慮讓「店」和「供應商」的角色,以及獨特的店鋪和具有用戶的供應商模型,可將其中一個或兩個分配給用戶。你可能已經有用戶對象,一旦認證已經完成,所以這點後,您可以使用一個服務檢索店和基於供應商信息的用戶分配的角色。
基本實現的一些快速須藤代碼:
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;
}
}
這意味着你可以很容易地通過添加一個「分銷商」角色和DistributerService擴展這個
但是,如果你仍然決心沿着這條路走下去,至少是我建議你還是有不同的店和供應商的模型,每一個擴展底座用戶模型,然後應用在每一個相關的關係。
例如:
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');
}
}