2017-04-20 62 views
0

我有一個平臺,讓我有是一個店的用戶,他們可以下訂單,我有一個是供應商的用戶,他們可以查看訂單。Laravel關係爲不同的用戶類型

現在,我在我的User類運行到一些邏輯問題的,比如我woud喜歡的供應商,能夠做到這一點

Auth::user()->orders 

但是,這是一個商店的用戶也應該能夠做到這一點

Auth::user()->orders 

我說明如何做到這一點在這裏了一個壞榜樣:

class User extends Authenticatable 
{ 
    public function orders() 
    { 
     return $this->hasMany(Order::class, 'created_by'); 
    } 

    public function alsoHasOrders() 
    { 
     return $this->hasMany(Order::class, 'fulfilled_by'); 
    } 

} 

應該有更好的方式來做到這一點嗎?

回答

4

對於初學者來說,我會建議你重新設計你的數據模型。您的用戶模型是您的身份驗證器,這就是它應該關注的一切。它不應該也是一個商店或供應商,或其他任何東西。供應商和商店應該是獨立的模型,它們擁有「用戶」。

你此刻在做什麼違反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'); 
    } 
}