@docxdocx

Как каскадно сохранить модель и его связи в Laravel Eloquent ORM?

Вопрос касается Eloquent ORM в Laravel 5.2. Допустим есть 3 таблицы (структура во вложенной картинке):
  1. authors
  2. books
  3. pages
5c1ca6fdc2018868338913.jpeg
Для них есть 3 модельки Author, Book, Page. Связи в классах моделей условно я настроил так:
Author -> hasMany(Book:class)

Book -> hasMany(Page::class)
Book -> belongsTo(Author:class)

Page -> belongsTo(Book:class)


Связи настроены правильно, выборка из БД работает как надо.

В Doctrine ORM или Phalcon ORM есть каскадное сохранение связей. Условно это выглядит вот так:
$firstPage = new Page();
$secondPage = new Page();

$book = new Book();
$book->setPages([$firstPage, $secondPage]);

$author = new Author();

$author->setBooks([$book]);

if ($author->save()) {
    echo 'ok';
} else {
    echo 'error';
}


После этого в трех таблицах создадутся записи с нужными связями. Причем это все сохранится в транзакции БД. Т.е. сохранятся все или никто.

В модельках laravel есть метод push, но то не то. Он сохраняет это не в транзакции и не сохраняет связей.

Как такое сделать в laravel?
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vism
Просто в Ларавель надо транзакцию запускать и комитить вручную.
Велкам!
Ответ написан
@Kostik_1993
PHP Backend Developer, Laravel, Yii, Vue, Node.js
Есть методы save, sync и еще несколько
А транзакция только одна на Try cath например
Какой смысл от транзакции если она для каждого запроса своя?))

Вот тебе пример
$this->db->beginTransaction();
try {
    $book = new Book;
    $author = $request->user();
    $author->books()->save($book);
    $this->db->commit();
} catch (\Exception $e) {
    $this->db->rollback();
    return 'Error';
}

return 'Success';
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы