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
访问时,您的关系属于许多它只返回列
答案
所以对于你的情况,withPivot
t3.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)的主要内容,如果未能解决你的问题,请参考以下文章