, 나는 당신이 당신의 데이터 모델을 재 설계 제안거야 건의 할 것입니다. 귀하의 사용자 모델은 귀하의 인증 자이며, 이것이 모두 고려해야 할 사항입니다. 또한 상점이나 공급 업체 또는 다른 어떤 것도 아니어야합니다. 공급 업체 및 쇼핑몰은 사용자가 '있는'고유 한 모델이어야합니다.
현재 수행중인 작업은 S.O.L.I.D.를 위반합니다. 여기에 귀하의 질문에 대한 답변의 대부분을합니다. 확장을 위해 특히 O 또는 열기, 수정을 위해 닫힘. 예를 들어 사용자가 상점과 공급 업체 인 경우 어떻게해야합니까? 나중에 라인을 추가하면 Distributer 유형도 추가됩니까? 이 모델로 돌아가서 if/else 문, 더 많은 관계 유형 등을 추가해야합니다 ...
대신 'shop'과 'supplier'의 역할과 별개의 Shop 및 공급 업체 모델 중 하나 또는 둘 다를 사용자에게 할당 할 수있는 사용자가있는 모델. 일단 인증이 완료되면 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');
}
}