【问题标题】:laravel model relationship pivot on pivots?laravel 模型关系枢轴上的枢轴?
【发布时间】:2016-01-04 10:07:05
【问题描述】:

我在我的网络应用程序中遇到了问题,我希望某个好心人能够为我提供一些帮助。

在我的应用程序中,我有用户和组织 - 在我看来,一个组织可以有 许多 个用户,一个用户可以有 许多 个组织,这表示多对多关系?

User n:m Organisation

意思是我需要一个数据透视表?让我们称其为 Organisation_User。目前一切似乎都很简单,但我的复杂之处在于组织中的用户可以拥有各种角色,

1) 管理员
2) 经理
3) 金融
4) 基本

这些角色的唯一规则是管理员取代其他一切。我的问题是,理论上用户 a 既可以是基本用户,也可以是同一组织中的财务用户。我正在努力研究如何最好地存储这些数据,我是否将其直接存储在数据透视表中?或者我是否创建了一个像Organisation_User_Roles 这样的枢轴,如果是这样的话,这在 Laravel 中是否可行?看起来怎么样?

【问题讨论】:

  • 也许可以在数据透视表中添加一列,例如role,并将唯一索引设置为user_organisation_role smth 这样吗?
  • 这很好,但是一个用户可以在一个组织中拥有多个角色,一个角色列不能代表这一点。
  • 可能是用户在组织中担任财务角色但没有基本角色的情况?
  • 理论上他们可以任意组合这 4 个角色,但如果他们在该组合中有 admin,则这将推翻所有其他角色。

标签: php mysql laravel eloquent relational-database


【解决方案1】:

阅读检索中间表列部分来自

https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

在您的数据透视表中,您可以添加一个额外的列 roles,您可以在其中用逗号分隔角色(名称或 ID)并在模型中构建自定义方法 hasRole

但请注意,这种方法可能存在可扩展性问题!


另一种方法是创建一个Role 模型和一个具有结构的附加表organisation_user_role

organisation_id
user_id
role_id

在您的 User 模型中构建一个方法 hasRoleInOrganisation($role_id, $organisation_id) 来查询该表。

如果查询此表,这种方法没有 Laravelish 方式。你必须使用:

DB::table('organisation_user_role')
    ->whereUserId($this->id)
    ->whereOrganisationId($organisation_id)
    ->whereRoleId($role_id)
    ->count();

【讨论】:

  • 感谢您,我已经考虑过这些方法,但都觉得它们不能很好地扩展,我现在正在考虑,在我的 organization_user 表中建立 1:n 关系并以这种方式工作。你怎么看?
  • 我仍然不知道您将在哪里获得角色关联。到目前为止,我看到的唯一可扩展的方法是我建议的第二种方法。
猜你喜欢
  • 1970-01-01
  • 2019-07-05
  • 2014-08-17
  • 2018-05-16
  • 2019-07-27
  • 2021-08-25
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多