2015-02-12 135 views
5

我有一个实体集,其中有很多项目。所以,在更新集合时,表单也会包含更新其项目的字段。我已经做到了,它运行良好,但我不确定它是否是正确和最有效/最优雅的方式。这里是我的代码:Laravel Eloquent - 保存/更新相关的一对多关系数据

 $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()可能吗?

回答

3

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

+0

是的,我看到了,我猜你并不需要一个特定的收藏传递给saveMany()的对象。我们可以像你一样使用简单的数组。经过测试和验证,它的工作。谢谢。 – 2015-02-12 06:27:05