2017-05-03 97 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); 
    } 
} 

同样,你的经理只是一个经理,因为他/她管理着多个属性。因此,您需要用户和属性之间的多重关系,以及关键点关系的详细信息。