首先,我建议您重新设计数据模型。您的用户模型是您的身份验证器,这就是它应该关注的全部。它也不应该是商店或供应商,或其他任何东西。供应商和商店应该是各自“拥有”用户的不同模型。
您目前的行为违反了 S.O.L.I.D.就像这里对您问题的大多数答案一样。特别是 O 或 Open 用于扩展,关闭用于修改。例如,如果用户是商店和供应商怎么办?如果稍后您还添加了一个分发器类型怎么办?您必须回到该模型并添加更多 if/else 语句、更多类型的关系等......
相反,我会考虑拥有“商店”和“供应商”角色以及具有用户的不同商店和供应商模型,其中一个或两个都可以分配给用户。完成身份验证后,您可能已经拥有 User 对象,因此在此之后,您可以使用服务检索 Shop 和 Supplier 信息,该服务基于用户分配的角色。
一些基本实现的快速 sudo 代码:
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;
}
}
这意味着您可以通过添加“分发者”角色和分发服务来非常轻松地扩展它
但是,如果您仍然决心走这条路,至少我建议您仍然有不同的 Shop 和 Supplier 模型,每个模型都扩展基本 User 模型,然后在每个模型中应用相关关系。
例如:
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');
}
}