Как массово обновить сводную таблицу для одних и тех же атрибутов в Laravel Many To Many

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

Снимок экрана Laravel Telescope

В моем состоянии я просто пытаюсь обновить одни и те же атрибуты для всех связанных записей сводной таблицы. Это мой сценарий:

foreach ($serials as $serial) {
    $newSerials[$serial['id']] = ['warehouse_id' => 1];
} 
$record->serials()->sync($newSerials)

Есть ли какое-либо другое решение, которое может выполнять обновление в сводной таблице только за один запрос в laravel с помощью Eloquent?

Я почти уверен, что Query Builder справится с этим, но то, что мне нужно знать, - это способ Eloquent, который, возможно, можно комбинировать с методом sync (), потому что я уже реализовал sync () в большинстве подобных случаев, подобных этому, в моем проекте .


person jojo    schedule 16.05.2020    source источник


Ответы (1)


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

foreach ($serials as $serial) {
    $newSerials[] = 
['serials_id'=>$serial->id,'record_id'=>$record->id,'warehouse_id' => 1];
} 
$record->serials()->newPivotQuery()->insert($newSerials);

и есть другой способ, вы можете создать модель для сводной таблицы, унаследовав ее от сводной таблицы, подробнее см .: https://laravel.com/docs/7.x/eloquent-relationships#defining-custom-промежуточные-таблицы-модели

Я должен отметить, что этот код вставляет $ newSerials, а не обновляет их, если вы хотите обновить запись, метод sync () - ваш лучший выбор

person OMR    schedule 16.05.2020