我有一个Laravel 5.4项目,其中有些模型: Client , Owner , Employee , Bank (实际上它是银行帐户,但我选择了Bank来简化与外键 Build 关系的命名约定) .
现在这里有一些事实:
-
每个客户可以拥有多个银行(银行账户) .
-
每个所有者可以拥有多个银行(银行账户) .
-
每个员工可以拥有多个银行(银行账户) .
-
每个银行(账户)只能有一个[客户或所有者或员工]
构建表和关系的最佳方法是什么 . 我想到了以下几点:
表:
-
clients:id,bank_id,其他字段......
-
所有者:id,bank_id,其他字段......
-
员工:id,bank_id,其他领域......
-
银行:id,client_id,owner_id,employee_id,其他字段......
模型关系
-
客户有许多银行和银行belogsTo客户[按照Laravel的指示完成]
-
所有者拥有许多银行和银行belogsTo所有者
-
员工有很多银行和银行belogsTo Employee
现在,在构建银行刀片视图表单(创建/更新)时,我应该有一个下拉菜单,例如 belongs_to 字段有客户,所有者,员工作为选项 - 然后相应地,我可以过滤掉三个表中的一个来选择 holder 银行账户的ID来分配它 .
缺点:
对于3个表中的一个,每个银行将只有一个活动外键 - 例如client_id = 36,其他两个值总是0,例如owner_id = 0&employee_id = 0)
这是 Build 关系的最佳方式还是有另一种更好的方式?如果可能,请提供银行的刀片视图表格 .
2 回答
看起来像polymorphic relationship的一个很好的候选人 .
您的表结构将类似于:
clients:id,其他字段......
所有者:id,其他领域......
员工:id,其他领域......
banks:id,bankable_id,bankable_type,其他字段......
与您提议的结构的主要区别在于我们没有在客户,所有者或员工表中指定银行(因为它们可以有多个) . 相反,我们使用bankable_id和bankable_type指定银行所属的用户类型 .
然后在你的三个用户模型中的每一个;客户,业主和员工,你有以下(最好把它放在一个特点):
在您的银行模型中,您可以拥有:
这将返回拥有银行的用户(客户,所有者或员工模型) .
这种关系适合Polymorphic Relation .
您可以将您的银行帐户应用于此类其他关系之一
请注意,我使用了名称
BankAccount
因为我真的建议使用一个特别提到它代表的名称 . 在将来,您或其他开发人员可能会对"Bank"实际上意味着"Bank Account"感到困惑 . 如果您决定将Banks添加到模型中,您还应该考虑将要执行的操作,因此每个帐户都属于"Bank" .多态关系的明显缺点是您不能在数据库表上拥有物理外键 .