使用 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 数据透视表不更新

Laravel 多列上的多对多同步()

如何最好地应用更新逻辑

将 Datatable 更新为 EXISTING 全局数据库连接

php Laravel Spatie更新用户和同步用户角色