【发布时间】:2019-03-11 12:03:52
【问题描述】:
another very similar issue 的答案非常有帮助(我目前正在使用)但会导致 n+1 查询问题。
我将概述我的用例。多态多对多关系 我有:
- 位置模型
- 供应商型号
- 用户模型
- Contactable(自定义枢轴模型 - 仍在充实这一点)
用户可以被标记为位置和供应商的联系人(也称为联系人)。 我需要不在分离联系人时分离它们(我需要记录用户曾经是某个位置或供应商的联系人的事实)所以我不想分离它们,我需要将它们标记为非活动状态。 我将把这个场景的范围限制在 contactables 表中的以下字段:
- 有效
- user_ID
- contactable_type
- contactable_ID
所以我正在执行:
$collectionOfLocationIds = $contactDetails->locations()->getRelatedIds(); //changed to 'allRelatedIds()' in 5.4+
foreach ($collectionOfLocationIds as $locationID)
{
$contactDetails->locations()->updateExistingPivot($locationID, ['active' => 0]);
}
这对我的大多数供应商来说都很好,但有些供应商有 5k+ 个位置,所以我正在执行 5k+ 个更新操作来处理真正应该是一个查询的内容。 DB 位于不同的服务器上,因此额外的几毫秒加起来很快......
我尝试将一个 id 数组传递给 updateExistingPivot 函数 (it says it will take a mixed type for the id parameter) 它不会产生错误,但它似乎只更新了数组中的第一个 id。我不确定这是否是一个新错误,@Wallace Maxters 提到他可以在 4.2 中传递一个数组,而我仍在 5.3 中工作,但我想知道是否有其他人遇到过这个问题。
(为清晰起见已更新)
【问题讨论】:
-
Laravel 5.7.11 增加了对数组的支持
updateExistingPivot(): github.com/laravel/framework/pull/26167
标签: php laravel eloquent laravel-5.3