Я пытаюсь удалить (или создать) модели связанных объектов при его обновлении. Каждый бар имеет несколько нажатий. Когда вы создаете панель, эти объекты касаний создаются, и вы можете обновить это число, и дополнительные касания будут созданы или удалены по мере необходимости.
Изначально я просто хотел использовать 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();
}
}
Кажется, это не самый простой способ написать это. Есть ли лучший способ написать это?
Кстати, для тех, кто интересуется, это в моей функции обновления в моем контроллере.
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();
Это должно работать К сожалению, это не работает, потому что оператор DELETE не поддерживает смещения.
Beertap::where('bar_id')->skip($taps_new)->delete();
Таким образом, он пропускает столько нажатий, сколько вы хотите сохранить, и удаляет остальные. Вы можете использовать orderBy
если это имеет значение, какие строки удаляются.
Это должно полностью работать сейчас. Сначала получите все идентификаторы для удаления из коллекции, а затем удалите их с помощью один запрос
$idsToDelete = $taps->slice($taps_new)->modelKeys();
Beertap::destroy($idsToDelete);
Вы также можете оптимизировать процесс создания (чтобы он выполнялся одним запросом)
$data = [];
for ($i = $taps_old; $i < $taps_new; $i++) {
$data[] = ['growlerstation_id' => $id];
}
Beertap::insert($data);
Заметка что при использовании вы потеряете функции Eloquent, такие как автоматические отметки времени и события модели insert()
,