与多个中间表的多对多 Laravel Eloquent 关系

Posted

技术标签:

【中文标题】与多个中间表的多对多 Laravel Eloquent 关系【英文标题】:Many to many Laravel Eloquent relationship with multiple intermediate tables 【发布时间】:2018-10-05 11:41:44 【问题描述】:

我使用的是 Laravel 5.4,模型和表结构如下:

users
-----
id

accounts
--------
id

holdings
--------
id
account_id (foreign key to account)

user_accounts
-------------
id
user_id
account_id
一个用户可以有多个帐户 一个帐户可以由多个用户共享 每个账户都有多个资产 因此,用户通过其多个帐户间接拥有许多资产。

我需要帮助在 User 模型上定义一个名为“holdings”的关系,以获取适用于该用户的所有馆藏(基于他们链接到的帐户)。

我尝试了很多不同的东西,并且在谷歌上花了很长时间。我可以同时使用 belongsToMany 和 hasManyThrough,但它们似乎只适用于 3 个表关系,其中中间表存储来自其他表的主键。如果我使用holdings 表上的account_id 外键来消除通过accounts 表加入的需要,我可以将我的关系减少到3 个表(而不是4 个),但是我似乎无法让它工作。

belongsToMany - holdings.id 必须是 holdings.account_id:

select * from `holdings`
inner join `user_accounts` on `holdings`.`id` = `user_accounts`.`account_id`
where `user_accounts`.`user_id` = ?

hasManyThrough - user_accounts.id 必须是 user_accounts.account_id:

select * from `holdings`
inner join `user_accounts` on `user_accounts`.`id` = `holdings`.`account_id`
where `user_accounts`.`user_id` = ?"

【问题讨论】:

【参考方案1】:

好吧,严格来说,这不是我询问 laravel 5.4 的答案,但它是一个可能的解决方案。

事实证明我很幸运,因为我遇到了这个 Laravel belongsToMany relationship defining local key on both tables,这表明 Laravel 5.5 中增强了 belongsToMany 关系以支持这种类型的场景。

我已将我的项目升级到 L5.5 并用关系替换了我的 hack:

return $this->belongsToMany(Holding::class, 'user_accounts', 'user_id', 'account_id', null, 'account_id');

很高兴地说它似乎工作得很好 - 至少对于我的用例基本获取,我没有尝试任何更新等。

感谢@cyberfly 和上面发布答案的人

【讨论】:

以上是关于与多个中间表的多对多 Laravel Eloquent 关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

Laravel 与 uuid 的多对多关系返回总是空的

Laravel 定义同一张表的多对多关系

TP5的多对多模型,以及中间表,已经中间表的增删改查

TP5的多对多模型,以及中间表,已经中间表的增删改查

使 ModelForm 与 Django 中的中间模型的多对多关系工作的步骤是啥?