Laravel Cascade Вставить через отношения HasMany - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в Laravel и хочу сохранить Мастер / Деталь за один шаг!

У меня есть следующие классы

Master => hasMany (Items)

и

Предмет => принадлежит (Мастер)

Итак, в моем контроллере я хочу создать экземпляр Master и множество экземпляров Items и сохранить их все за один шаг ... вот так

    $master = new  Master();
    $master->field = $someField;

    foreach ($myArray as $var) {
        $item = new  Item();
        $item->someField =  $field;
        // I suppose I need to relate Item with master, but... how?
    }

and here y want to persist all objectes like that
$master->save(); and Eloquent must to persist Master and Items...

но я предпочитаю делать это без настойчивого Учителя, сначала ...

Возможно ли это? Я не понимаю, как это сделать ...

Заранее спасибо

Nicolas

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете обернуть все это с помощью метода transaction() с фасада DB:

$bar = 'bar';

DB::transaction(function () use ($bar) {
    $master = new  Master();
    $master->foo = $bar;

    $items = [];
    foreach ($myArray as $var) {
        $item = new  Item();
        $item->someField =  $field;

        $items[] = $item;
    }

    $master->save();
    $master->items()->saveMany($items);
});

Это автоматически перехватит любое исключение, откатит транзакцию и повторно сгенерирует.

Или вы можете сделать это вручную с помощью DB::beginTransaction(), DB::rollBack() и DB::commit().

https://laravel.com/docs/5.7/database#database-transactions

0 голосов
/ 06 ноября 2018

Поскольку мастер имеет элементы, мастер должен быть сохранен первым, поэтому у нас есть идентификатор мастера, и мы можем связываться с элементами. Измените код таким образом

$master = new  Master();
$master->field = $someField;
$master->save(); 

foreach ($myArray as $var) {
    $item = new  Item();
    $item->someField =  $field;
    $item->master_id =  $master->id;
    $item->save();
}
...