Есть еще одна очень похожая проблема с ответом, который был очень полезен (и я в настоящее время использую), но вызывает проблему n + 1 запроса.
Я обрисую в общих чертах мое использованиедело.Полиморфные отношения «многие ко многим», которые у меня есть:
- Модель местоположения
- Модель поставщика
- Модель пользователя
- Контактная (модель пользовательского центра - по-прежнему этоout)
Пользователи могут быть отмечены как контакты (или контактные данные) как для Местоположений, так и для Поставщиков.Мне нужно не отсоединять контактные элементы при их разобщении (мне нужна запись о том, что пользователь когда-то был контактом для местоположения или поставщика), поэтому я не хочу отсоединять их, мне нужно отметитьони неактивны.Я ограничу область применения этого сценария следующими полями в таблице контактных данных:
- active
- 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 + для того, что должнодействительно один запрос.БД работает на другом сервере, поэтому несколько дополнительных миллисекунд складываются довольно быстро ...
Я попытался передать массив идентификаторов в функцию updateExistingPivot ( говорит, что для смешанного типа потребуетсяпараметр id ) он не выдает ошибку, а только обновляет первый идентификатор в массиве.Я не уверен, что это новая ошибка, @ Уоллес Макстерс упомянул, что он мог передать массив в 4.2, а я все еще работаю в 5.3, но мне интересно, если кто-то еще имел этопроблема.
(обновлено для ясности)