Удаление одной коллекции из родительского обновления

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

Изначально я просто хотел использовать pop как это:

        $taps=$bar->taps;
if ( $taps_old < $taps_new){
for ($i = $taps_old; $i < $taps_new; $i++) {
$tap = Growlertap::create(['growlerstation_id' => $id]);
}
}
elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
$taps->pop();
}

который не работает, но не дает мне ошибку. Я знаю, что оператор if работает нормально, потому что код ниже работает:

        elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
Beertap::where('bar_id', '=', $id)->first()->delete();
}
}

Кажется, это не самый простой способ написать это. Есть ли лучший способ написать это?

Кстати, для тех, кто интересуется, это в моей функции обновления в моем контроллере.

1

Решение

pop() удалит последний элемент в вашей локальной коллекции, но это изменение не сохранится в базе данных.

Предполагая, что это Beertap объект, что-то вроде этого должно работать:

Предупреждение: непроверенный код

    ...
elseif ($taps_old > $taps_new) {
for ($i = $taps_new; $i < $taps_old; $i++) {
$delete_me = $taps->pop();
$delete_me->delete();
}
}

или более кратко: $taps->pop()->delete();

1

Другие решения

Это должно работать К сожалению, это не работает, потому что оператор DELETE не поддерживает смещения.

Beertap::where('bar_id')->skip($taps_new)->delete();

Таким образом, он пропускает столько нажатий, сколько вы хотите сохранить, и удаляет остальные. Вы можете использовать orderBy если это имеет значение, какие строки удаляются.

Обновить

Это должно полностью работать сейчас. Сначала получите все идентификаторы для удаления из коллекции, а затем удалите их с помощью один запрос

$idsToDelete = $taps->slice($taps_new)->modelKeys();
Beertap::destroy($idsToDelete);

Обновление 2

Вы также можете оптимизировать процесс создания (чтобы он выполнялся одним запросом)

$data = [];
for ($i = $taps_old; $i < $taps_new; $i++) {
$data[] = ['growlerstation_id' => $id];
}
Beertap::insert($data);

Заметка что при использовании вы потеряете функции Eloquent, такие как автоматические отметки времени и события модели insert(),

1

По вопросам рекламы [email protected]