2016-09-01 4 views
1

Об одном изменении Laravel 5.3,Теперь save() return false в Laravel 5.3

Теперь у меня есть модель, которую я хочу сэкономить.

Раньше я делал:

$result = $model->save(); 

И я мог бы знать, если операция прошла успешно.

Теперь, с новым:

красноречивым метод сохранения теперь возвращает ложь, если модель не была изменена с момента последнего он был извлечен или сохранен.

упоминается в upgrade guide

Если модель не изменилась, то вернуть ложь.

Теперь мой код говорит мне, что произошла ошибка, потому что я верю, что true или false является результатом хорошей или плохой работы.

Итак, как я могу проверить, что save() был успешным, даже если он не изменил данные ???

+0

где это говорит, что возвращает ложь в 5.3? – Sherif

+0

https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0 –

+2

Полная цитата имеет больше смысла, чем цитата без контекста выше. Метод сохранения Eloquent теперь возвращает false, если модель не была изменена с момента последнего ее восстановления или сохранения. «Кажется, подразумевается, что если вы загрузили модель и сразу использовал 'save()' он вернул бы false вместо true ранее. – Blake

ответ

3

Проверьте, не загрязнена ли ваша модель.

//    A     B 
$result = !$model->isDirty() || $model->save() 
  • Если ваша модель была изменена, A будет false, но B должен быть true. Таким образом, $result будет true
  • Если ваша модель не была изменена, A будет true, поэтому $result будет правдой.
  • Если ваша модель была изменена и не была успешно сохранена, вы получите false как в A, так и B, поэтому $result будет ложным.

Объясняю: Это происходит потому, что Eloquent просто сделать запрос DB IF что-то изменилось. Разработчики Laravel решили изменить ответ save(), поэтому теперь вы можете узнать, был ли выполнен запрос или что-то изменилось.


Согласно @patricus комментарий, первое решение не будет вызывать в saving() и updating события, по очевидной причине: PHP как многие языки перестанут вычисляя или выражение, когда true найден.

Так что, если вам нужно это события, которые инициированы, вы должны сделать это:

$wasClean = $model->isClean(); // The oposite of 'isDirty()' 
$result = $model->save() || $wasClean; 
+0

Существует два оговорки к этому методу. Во-первых, если в модели есть событие 'save()', этот метод будет препятствовать тому, чтобы его вызывали, когда модель не загрязнена. Во-вторых, если вы попытаетесь вставить новую, пустую запись в базу данных, этот метод предотвратит это. – patricus

+0

Кроме того, модель имеет метод 'isClean()', если вы предпочитаете использовать это над '! isDirty() '. – patricus

+0

@patricus Добавлен новый ответ –

Смежные вопросы