Константин Б., я не говорил что каждую модель нужно обернуть в транзакцию. Я говорил что нужно проверять возвращаемый ответ метода save каждой модели. Это судя по возможностям eloquent.
Константин Б., ну возможно я и туговат. Мой вопрос косательно конкретного ORM. Учитывая возможности Eloquent и возможные варианты у меня появляются сложности. А Вы как-то абстрактно уходите в философию. Ваш пример хороший, но он не покрывает все варианты событий. Как сказал vism, нужно проверять что возвращает метод save. Он в каких-то случаях может вернуть false. При таком случае Ваш код сохранит в БД не целостные данные.
Спасибо что показали как работает транзакция, но я и сам знаю как она работает. Вопрос именно про возможности Eloquent ORM.
объектов может быть не создан, а уж тем более не сохранен?
— есть определенные моменты когда save вернет false. Если в событийных методах вернется false. Только не говорите мне что нельзя пользоваться событиями модельки в Laravel.
Моя цель не понтануться и найти не соответствия в Вашем примере, а понять как сделать правильно. Поэтому прошу быть менее агрессивным.
Константин Б., и как же написать мой пример? 4 сущности и они связаны между собой.
Задача: Сохранить все транзакционно и малым количеством кода.
Всегда легко сказать что ваш код гавно. В вопросе я привел прекрасный пример, который прекрасно работает на doctrine2. Как такое хорошее решение сделать на eloquent?
vism, он не сохраняет связи. В таблице pages поле book_id сохранится как null. В таблице books поле author_id будет null. А если в таблице поля указаны как not null, то кинется QueryException.
vism, метод save не возвращает false, если например поле не должно быть null. Он либо вернет true, либо кинет exception QueryException. Ну это я судя по коду laravel говорю.
false возвращается только если событийные методы модели (типа saving, creating и т.д.) возвращают false. По событиям я пока не силен, но все равно это не особо влияет на сохранение если этих методов в модели нет.
vism, не понял Вас. Если не удалось выполнить SQL запрос метод save выдает исключение Illuminate\Database\QueryException. Возможно не сам метод save, а кто-то дальше который обращается в БД.
Вы меня не правильно поняли по транзакции. Нужно чтобы все сохранялось в одной транзакции. Как у Вас в примере.
Спасибо за ответ. Я не заметил что метод save кидает исключение QueryException. Я думал что он молча выдает true или false. Тогда с транзакцией вопрос решен. Спасибо.
Но непонятно как быть с каскадным сохранением. У Вас легкий случай. так как сохраняется только одна сущность. Мне же нужно сохранить сразу 3 сущности. Я конечно могу вызвать метод save несколько раз. Но мне от этого как-то не спокойно на душе. В doctrine или phalcon я привык в нужных классах биндить связи и в конце один раз вызвать метод save.
Ну это да. Но прикиньте как в моем случае 4 сущности, получается нужно будет рекурсивно пробежатся по связям, поставить id где надо и везде проверять что вернул метод save обернув все это в транзакцию.
На самом деле, это можно сделать. Но я вряд ли сделаю лучше чем ребята из doctrine)