Laravel Eloquent - 保存/更新相关的一对多关系数据

Posted

技术标签:

【中文标题】Laravel Eloquent - 保存/更新相关的一对多关系数据【英文标题】:Laravel Eloquent - Save/Update Related One-To-Many Relationship Data 【发布时间】:2015-04-12 15:49:28 【问题描述】:

我有一个包含许多项目的实体集。因此,在更新集合时,表单也包含更新其项目的字段。我已经做到了,并且运行良好,但我不确定这是否是正确和最有效/最优雅的方式。这是我的代码:

        $set->fill(Input::all());

        foreach (Input::get('course') as $course_id => $content) 
            $item = $set->items->filter(function ($item) use ($course_id) 
                return ($item->course_id == $course_id);
            )->first();
            $item->content = $content;
            $set->items()->save($item);
        
        $set->save();

如您所见,对于每个项目,我遍历了所有输入(可能会因输入的数量而异),对其进行过滤,并将值 1 乘 1 保存。因此,每次迭代都会执行一个查询。我使用过滤器,这样它就不必为每次检查进行查询。

所以我的问题是,有没有更有效/优雅的方法来做到这一点?可能像 saveMany() 这样的东西?

【问题讨论】:

【参考方案1】:

您可以像这样使用 saveMany 方法:

        $set->fill(Input::all());
        $items = array();
        foreach (Input::get('course') as $course_id => $content) 
            $item = $set->items->filter(function ($item) use ($course_id) 
                return ($item->course_id == $course_id);
            )->first();
            $item->content = $content;
            $items[] = $item;
        

        $set->items()->saveMany($items);
        $set->save();

正如laravel docs的相关模型中指出的那样

【讨论】:

是的,我看到了,我想您不需要将特定的 Collection 对象传递给 saveMany()。我们可以像你一样使用简单的数组。测试并验证它的工作。谢谢。

以上是关于Laravel Eloquent - 保存/更新相关的一对多关系数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 显示后更新

Laravel Eloquent $model->save() 不保存但没有错误

Laravel 不使用 Eloquent 更新项目

如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性

如何更新 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?

Laravel (Eloquent) 不更新数据库