UpdateExistingPivot для нескольких идентификаторов в цикле = n + 1 проблема.Есть ли другой способ? - PullRequest
0 голосов
/ 06 октября 2018

Есть еще одна очень похожая проблема с ответом, который был очень полезен (и я в настоящее время использую), но вызывает проблему n + 1 запроса.

Я обрисую в общих чертах мое использованиедело.Полиморфные отношения «многие ко многим», которые у меня есть:

  1. Модель местоположения
  2. Модель поставщика
  3. Модель пользователя
  4. Контактная (модель пользовательского центра - по-прежнему этоout)

Пользователи могут быть отмечены как контакты (или контактные данные) как для Местоположений, так и для Поставщиков.Мне нужно не отсоединять контактные элементы при их разобщении (мне нужна запись о том, что пользователь когда-то был контактом для местоположения или поставщика), поэтому я не хочу отсоединять их, мне нужно отметитьони неактивны.Я ограничу область применения этого сценария следующими полями в таблице контактных данных:

  1. active
  2. user_ID
  3. contactable_type
  4. 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, но мне интересно, если кто-то еще имел этопроблема.

(обновлено для ясности)

1 Ответ

0 голосов
/ 06 октября 2018

Используйте raw query вместо relationship.

Я не совсем понимаю, какие строки вы хотите отключить.
Итак, давайте подумаем, что вы хотите, чтобы неактивные контактные для определенного user.
Если это не так, замените его на where().

DB::table('contactable')->where('user_id', $user_id)
    ->update(['active' => 0]);

, он будет выполнять только один запрос.

...