Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)

Posted

技术标签:

【中文标题】Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)【英文标题】:Laravel: save / attach / sync custom pivot model (belongsToMany) 【发布时间】:2021-01-08 04:46:27 【问题描述】:

希望你今天过得愉快。

我正在使用 Laravel 8。我有三个模型,我需要这些模型“纠缠”,可以这么说。

所以,我有三个基本表

areas,threats,positions
---
id
name

所以需要的关系是这样的:

每个t3 属于ToMany t1,反之亦然。 (多对多) 每个t3.t1 关系都属于ToMany t2(多对多)

到目前为止,我的方法是这样的:

对于第一个关系,我在模型上定义了 belongsToMany 关系 (t3.t1)。 对于第二个关系,我为数据透视表创建了一个 custom pivot model,在该模型中我定义了第二个多对多关系 (t3t1.t2)。

到目前为止,第一个关系可以通过$model->relatedModel()->attach($id);保存。

现在,对于第二个关系,我如何附加相关模型?

我最后的手段是查询已保存的自定义数据透视模型并附加 t2 模型,但我想先询问是否有更简洁的 eloquent-laravel 方法来执行此操作.

任何建议都会有所帮助。提前感谢您抽出宝贵时间。

【问题讨论】:

可以分享一下你用过的代码吗? 【参考方案1】:

解释

attach 方法实际上是一个Model 函数。所以你的withPivot t3.t1 还不是模特 ,当您使用pivot magic method 访问时,您的关系属于许多它只返回列

答案

所以对于你的情况,withPivott3.t1 转为Model instance。这里是步骤

    创建扩展 use Illuminate\Database\Eloquent\Relations\Pivot; 的新 PivotModel 在您的t1Model 上,将using($classNamespace) 添加到belongsToMany 方法中,例如:belongsToMany()->using(PivotModel::class) 然后当t1->getT2s->pivot 已经返回Model instance 并且您可以使用attach 函数到该枢轴

【讨论】:

【参考方案2】:

我能想到的两种方式之一就是参考Spatie Laravel Role permission

在 Spatie 中,这种关系类似于 Permission 和 Role 之间的多对多关系以及映射用户、角色和权限的多对多多态关系。

在多对多枢轴关系中使用额外属性。

somethinglike

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');

附加和分离也接受extra attributes。

$user->roles()->attach($roleId, ['expires' => $expires]);

在检索时,您可以使用 where 子句来指定您的选择

return $this->belongsToMany('App\Role')->wherePivot('approved', 1);

我希望这会给你足够的想法来实现它。所有sn-p都来自文档,大家可以直接搜索参考

【讨论】:

我实际上是用你回答的数据透视列实现的。我想知道是否有更“雄辩”的方式来做到这一点,也许 spatie 方法更有可能奏效。谢谢。 @Chuy 为什么你认为,这不是雄辩的?我想了解这一点,以便我可以考虑您希望如何实现它? @Chuy 我的另一个问题是,您对实施 spate 方式有何想法? 当我说“雄辩”时,我的意思是使用声明性方式来提取信息(因为 spatie 权限处理它)。亲切的问候。 @Chuy 好的,那么您认为如果您实施 spate 方式,您的问题会得到解决吗?如果是的话,你需要我解释一下吗?

以上是关于Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将枢轴附加到具有多个值的表

Laravel 验证:存在附加列条件 - 自定义验证规则

Laravel中的多重关系(枢轴)

使用具有附加属性的自定义层保存和加载 keras 模型

Laravel 多对多同步与附加列

Laravel:向枢轴模型添加关系