laravel雄辩关系3个模型

时间:2017-09-11 01:07:21

标签: php mysql laravel model relationship

我有一个Laravel 5.4项目,其中包括以下模型:客户所有者员工银行(实际上它是银行账户,但我选择了Bank来简化与外键建立关系的命名约定。)

现在这里有一些事实:

  • 每个客户可以拥有多个银行(银行账户)。
  • 每个所有者可以拥有多个银行(银行账户)。
  • 每个员工都可以拥有多家银行(银行账户)。
  • 每个银行(帐户)只能有一个[客户或所有者或员工]

构建表格和关系的最佳方法是什么。 我想到了以下几点:

表:

  • clients:id,bank_id,其他字段......
  • 所有者:id,bank_id,其他字段......
  • 员工:id,bank_id,其他领域......
  • 银行:id,client_id,owner_id,employee_id,其他字段......

模型关系

  • 客户有很多银行和银行顾客[按照Laravel的指示完成]
  • 所有者拥有许多银行和银行belogsTo所有者
  • 员工有很多银行和银行belogsTo Employee

现在构建银行刀片视图表单(创建/更新) 我应该有一个下拉菜单,例如 belongs_to 字段,将客户,所有者,员工作为选项 - 然后相应地,我可以过滤掉三个表中的一个,以选择 持有人 的ID银行账户分配。

缺点:

每个银行将只有3个表格中的一个表格的活动外键 - 例如client_id = 36,其他两个值总是0,例如owner_id = 0& employee_id = 0)

这是建立关系的最佳方式还是有另一种更好的方式?如果可能,请提供银行的刀片视图表单。

2 个答案:

答案 0 :(得分:1)

看起来像是polymorphic relationship的好人选。

您的表格结构如下所示:

  • 客户:id,其他字段......
  • 所有者:id,其他字段......
  • 员工:id,其他领域......
  • 银行:id,bankable_id,bankable_type,其他字段......

与您提议的结构的主要区别在于我们没有在客户,所有者或员工表中指定银行(因为它们可以有多个)。相反,我们使用bankable_id和bankable_type指定银行所属的用户类型。

然后在你的三个用户模型中的每一个;客户,所有者和员工,您有以下内容(最好将其置于特征中):

public function banks()
{
    return $this->morphMany('App\Bank', 'bankable');
}

在您的银行模型中,您可以拥有:

public function bankable()
{
    return $this->morphTo();
}

将返回拥有银行的用户(客户,所有者或员工模型)。

答案 1 :(得分:0)

此关系适合Polymorphic Relation

您可以让您的银行帐户适用于此类

之类的其他关系
class BankAccount extends Model 
{
    public function accountOwner()
    {
        return $this->morphTo();
    }
}

class Client extends Model
{
    public function bankAccount()
    {
        return $this->morphMany('BankAccount', 'bankAccount');
    }
}

请注意,我使用了名称BankAccount,因为我真的建议使用一个特别提到它代表的名称。在将来,您或其他开发人员可能会对" Bank"实际意义"银行账户"。如果您决定将银行添加到您的模型中,您还应该考虑将要执行的操作,因此每个帐户都属于"银行"。

多态关系的明显缺点是你不能在数据库表上拥有物理外键。