php - 复杂的 Laravel 关系

标签 php mysql laravel database-design polymorphism

我在如何在 Laravel 中设置表/关系方面遇到了一些问题。

描述: 一个用户可以有 3 种类型(租户、经理、管理员)。 admin 是最简单的类型,它没有额外的属性。租户和经理具有与每种类型相关的额外属性。此外,租户与一个单元具有 1-1 关系(假设现在每个单元有 1 个用户帐户),而经理与属性具有 N-N 关系(多个经理可以管理 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');
}

优点:

  • 没有骇人听闻的代码。

缺点:

  • 无法设置外键约束,subaccount_id 可以为空,如果 用户是管理员
  • 我觉得用户不应该属于租户/经理,这 关系应该是相反的

方法二

租户和管理员都属于用户 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

缺点:

  • 我觉得用户中的“动态”关系很奇怪 感觉很老套。

希望获得对此的不同观点或对我可以构建它的任何其他方式的想法。

最佳答案

如果您考虑是什么让用户成为租户,您可能会发现唯一的原因就是他们与单元的关系。孤立地,如果租户没有单元,则他们只是一个用户。

因此:

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/

相关文章:

php - 如何在 Laravel 中发送 PUT 请求

php - 来自外部源的 Laravel Eloquent 无表数据

php - Laravel 5.5 ThrottleRequest 中间件

php - 使用正则表达式的深度(无限)嵌套拆分词

php - Ajax 调用对于特定查询的特定 if else 语句无法正常工作

php - 使用 PHP 将复选框数组中的数据插入 MySQL 表

MYSQL 选择子查询 IF 存在

mysql - mysql中如何计算单列多行之和

php - 电子商务,存储订购的产品和产品选项

php - laravel 5.6 SQLSTATE[HY000] [2002] 全新安装时连接被拒绝