2017-05-03 93 views
1

我正面臨着如何在laravel中設置我的表/關係的問題。複雜的Laravel關係

說明: 用戶可以有3種類型(承租人,經理,管理員)。管理員是最簡單的類型,它沒有額外的屬性。租戶和經理擁有與每種類型相關的額外財產。此外,租戶與單位之間存在1-1的關係(假設現在每個單位有1個用戶帳戶),並且經理與屬性之間存在N-N關係(多個經理可以管理1個房產,1個經理可以管理多個房產)。

我想出什麼了到目前爲止:

方法1

用戶具有多態的關係,同時屬於承租人和管理者。 method1.jpg

如何我的模型關係將成立:

User.php

public function subaccount() 
{ 
    return $this->morphTo('subaccount'); 
} 

Manager.phpTenant.php

public function user() 
{ 
    return $this->morphOne(User::class, 'subaccount'); 
} 

優點:

  • 沒有hacky的代碼。

缺點:

  • 廣東話建立外鍵約束,subaccount_id可以爲空,如果 用戶是管理員
  • 我覺得用戶應該不屬於租戶/經理,這 關係應該是其他方式

方法2

兩個租戶和管理者將屬於用戶 method2.jpg

如何我的模型關係將成立:

Manager.phpTenant.php這些都很好

public function user() 
{ 
    return $this->belongsTo(User::class); 
} 

User.php需要像這樣

public function subaccount() 
{ 
    if ($this->type === 'tenant') { 
     $resource = Tenant::class; 
    } else if ($this->type === 'manager') { 
     $resource = Manager::class; 
    } 

    return $this->hasOne($resource); 
} 

優點:

  • 可以設置外鍵約束,沒有subaccount_id

缺點:

  • 我彷彿置身於用戶是 「動態」 的關係很奇怪和 感覺哈克。

很想得到不同的觀點或想法,我可以建立此任何其他方式。

+0

模型用戶 - >租賃 - >單元和用戶 - >管理 - >屬性,其中租賃和管理是樞紐? – Jason

回答

0

如果您考慮讓用戶成爲租戶的原因,您可能會發現唯一的問題是他們與單位的關係。孤立地說,租戶只是一個用戶,如果他們沒有單位。

因此:

class User { 
    public function Tenancy() { 
    return $this->hasOne(Tenancy::class); 
    } 
} 
... 
class Tenancy { 
    public function Unit() { 
    return $this->belongsTo(Unit::class); 
    } 
} 

同樣,你的經理只是一個經理,因爲他/她管理着多個屬性。因此,您需要用戶和屬性之間的多重關係,以及關鍵點關係的詳細信息。