Laravel级联通过HasMany关系插入

时间:2018-11-05 22:56:21

标签: laravel eloquent save has-many cascade

我是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...

但是我更喜欢先不坚持大师……

有可能吗? 我不知道该怎么做...

预先感谢

尼古拉斯

2 个答案:

答案 0 :(得分:0)

由于母版有一个项目,因此必须先保存该母版,因此我们具有母版ID,并且可以与这些项目关联。 以此方式更改代码

$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();
}

答案 1 :(得分:0)

您可以使用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