2017-04-20 1 views
0

나는 상점이있는 사용자가 있고, 주문할 수 있으며 공급 업체 인 사용자가 있고, 주문 된 주문을 볼 수있는 플랫폼이 있습니다. 다른 사용자 유형에 대한 Laravel 관계

는 지금은 공급이

Auth::user()->orders 

그러나 가게는 사용자를 할 수있을 때까지 내가 좋아하는 woud 내 사용자 클래스에서 예를 들어, 일부 로직 문제의 실행 해요

: 또한 내가 여기에이 작업을 수행하는 방법에 대한 나쁜 예를 보여이

Auth::user()->orders 

을 할 수 있어야

이 작업을 수행하는 더 좋은 방법이 있습니까? 인증의

답변

4

, 나는 당신이 당신의 데이터 모델을 재 설계 제안거야 건의 할 것입니다. 귀하의 사용자 모델은 귀하의 인증 자이며, 이것이 모두 고려해야 할 사항입니다. 또한 상점이나 공급 업체 또는 다른 어떤 것도 아니어야합니다. 공급 업체 및 쇼핑몰은 사용자가 '있는'고유 한 모델이어야합니다.

현재 수행중인 작업은 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'); 
    } 
} 
관련 문제