我在如何在 Laravel 中设置表/关系方面遇到了一些问题。
描述: 一个用户可以有 3 种类型(租户、经理、管理员)。 admin 是最简单的类型,它没有额外的属性。租户和经理具有与每种类型相关的额外属性。此外,租户与一个单元具有 1-1 关系(假设现在每个单元有 1 个用户帐户),而经理与属性具有 N-N 关系(多个经理可以管理 1 个属性,1 个经理可以管理多个属性)。
到目前为止我想出了什么:
方法一
我的模型关系将如何建立:
User.php
public function subaccount()
{
return $this->morphTo('subaccount');
}
Manager.php
和 Tenant.php
public function user()
{
return $this->morphOne(User::class, 'subaccount');
}
优点:
- 没有骇人听闻的代码。
缺点:
- 无法设置外键约束,subaccount_id 可以为空,如果 用户是管理员
- 我觉得用户不应该属于租户/经理,这 关系应该是相反的
方法二
我的模型关系将如何建立:
Manager.php
和 Tenant.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
缺点:
- 我觉得用户中的“动态”关系很奇怪 感觉很老套。
希望获得对此的不同观点或对我可以构建它的任何其他方式的想法。
最佳答案
如果您考虑是什么让用户成为租户,您可能会发现唯一的原因就是他们与单元的关系。孤立地,如果租户没有单元,则他们只是一个用户。
因此:
class User {
public function Tenancy() {
return $this->hasOne(Tenancy::class);
}
}
...
class Tenancy {
public function Unit() {
return $this->belongsTo(Unit::class);
}
}
同样,您的经理只是一个经理,因为他/她管理着多个属性。因此,您需要 User 和 Property 之间的多对多关系,以及关系的详细信息。
关于php - 复杂的 Laravel 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767039/