首页 文章

laravel雄辩关系3个模型

提问于
浏览
2

我有一个Laravel 5.4项目,其中有些模型: ClientOwnerEmployeeBank (实际上它是银行帐户,但我选择了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 回答

  • 0

    看起来像polymorphic relationship的一个很好的候选人 .

    您的表结构将类似于:

    • clients:id,其他字段......

    • 所有者:id,其他领域......

    • 员工:id,其他领域......

    • banks: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

    这种关系适合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"实际上意味着"Bank Account"感到困惑 . 如果您决定将Banks添加到模型中,您还应该考虑将要执行的操作,因此每个帐户都属于"Bank" .

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

相关问题