Откат Laravel сохранил изменения, если при сохранении дочерней модели возникла ошибка - PullRequest
0 голосов
/ 18 февраля 2019

Например, у меня есть отношение Пользователь hasMany Books.

Давайте рассмотрим этот сценарий.

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

На самом деле у меня нет кодапредоставлять.В настоящее время я планирую создать код, и я подумал об этой идее.

1 Ответ

0 голосов
/ 18 февраля 2019

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

  1. Если что-то пойдет не так, вы можете просто позвонить DB::rollBack(), и это будет похоже на то, что запросы никогда не выполнялись.
  2. Удаление вручную все равно будет выполняться по первичному ключу / автоматическому приращению / идентификатору последовательности.Поэтому, если пользователь (id = 4) будет сохранен, но, к сожалению, при сохранении книги этого пользователя вы столкнетесь с ошибкой, и теперь вы удаляете пользователя.Поэтому в следующий раз, когда вы сохраните другого пользователя, у него будет id = 5, а не 4;это даст пробелы в идентификаторе автоинкремента, что технически не проблема, но выглядит не очень хорошо.Эта проблема полностью исключается в случае транзакций

. Вот базовая структура операции на основе транзакций в laravel

DB::beginTransaction(); // <-- first line  

try{
    // code ....
    // saved User
    // code ...
    // saved Book
    if($saved)
    $childModelSaved = true; 
    else
    $childModelSaved = false; 
}
catch(Exception $e)
{
     $childModelSaved = false;
}

if($childModelSaved)
{
    DB::commit(); // YES --> finalize it 
}
else
{
    DB::rollBack(); // NO --> some error has occurred undo the whole thing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...