复杂的Laravel关系

时间:2017-05-03 18:00:12

标签: php mysql laravel database-design polymorphism

我在如何在laravel中设置我的表/关系时面临一些问题。

说明 用户可以有3种类型(租户,经理,管理员)。 admin是最简单的类型,它没有额外的属性。租户和经理拥有与每种类型相关的额外属性。此外,租户与单位的关系为1-1(假设现在每个单位有1个用户帐户),并且经理与属性有NN关系(多个经理可以管理1个属性,1个经理可以管理多个属性)。 / p>

到目前为止我想出了什么:

方法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可以为null 用户是管理员
  • 我觉得用户不应该属于租户/经理,这个 关系应该是另一种方式

方法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

缺点:

  • 我觉得那样"动态"用户的关系很奇怪 感觉很讨厌。

我希望能够对此有不同的看法,或者想以其他任何方式构建这个。

1 个答案:

答案 0 :(得分:0)

如果您考虑使用户成为租户的原因,您可能会发现他们与单位的关系是唯一的。如果他们没有单位,租户就是一个用户。

因此:

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

同样,您的经理只是经理,因为他/她管理多个房产。因此,您需要在用户和财产之间建立多对多的关系,并在枢轴上显示关系的详细信息。