使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充
Posted
技术标签:
【中文标题】使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充【英文标题】:sync or updateExistingPivot with Laravel -- How to fill based on a 3rd critria 【发布时间】:2014-11-21 11:12:12 【问题描述】:事情是这样的,我有 3 个表,users/users_types/types。
我通过 users_types 在用户和类型之间建立了一个 belongToMany,其中包含一些信息。 其中之一是表格中的行号。 我正在尝试根据 userID 和行号而不是 typeID 更新表格,后者由我的输入填充。
我怎样才能做到这一点? 我一直在努力
updateExistantPivot($line_number->line_number,array(
'type_id' => $type_id,
'etc' => $etc,
'duration' => $duration
)
);
但显然它不会起作用,因为它需要 typeID 而不是 line_number...我总是想更新相同的 line_number 和 userID。 (我每行都在一个 for 循环中)。
感谢您的帮助!
哦,我确实尝试过同步...但它给了我一个外键错误,因为它发送了不应该存在的数字。
【问题讨论】:
【参考方案1】:如果您想更新现有的数据透视表,您可以这样做:
$model; // parent of the relation
$related; // related object already synced with the $model
$model->relation()->sync([$related->id => [ 'duration' => 'someValue'] ], false);
第一个参数是以相关模型 id 作为键的数组,以及要更新的枢轴值数组,而第二个参数设置为 false
意味着您不会分离所有其他相关模型。
【讨论】:
嘿@JarekTkaczyk OMG!太感谢了 !!!它有效,但我必须将 false 更改为 true 才能更新而不是每次都重新创建新行! Laravel 的文档并没有解释得那么好!再次感谢! 并非如此 - 当您使用sync
时,不会复制任何内容,而是更新。如果您使用attach
,那么是的,您将每次创建新的数据透视条目。请注意,不使用 false
会重置给定模型的所有数据透视条目,并仅添加提供的数据。
是的,我确实使用 attach 来创建该条目 - 这就是为什么我必须使用 false 的原因吗? Ummmm ...自从数据进入表格以来,是否重置枢轴是否重要?当我做错事情时,我确实注意到,当出现错误并且代码停止时,我的简单同步正在删除整个条目。老实说,仍然对枢轴的工作方式感到困惑...我知道它是一个临时数组,它使用所有链接表的信息+链接表中的那些(您定义的)创建...是否正确?谢谢!
@Jarek Tkaczyk,看来你可以帮助我。看看这个:***.com/questions/44519339/…【参考方案2】:
现在你也可以使用 Laravel 7
syncWithoutDetaching
文档中的链接 https://laravel.com/docs/7.x/eloquent-relationships#many-to-many
【讨论】:
以上是关于使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充
在 laravel 中使用多对多关系同步:PostgreSQL 数据透视表不更新