2014-04-15 77 views
0

我怎么会拿东西了疯狂的N + 1的问题,如:优化嵌套很深的雄辩环

 foreach ($serie->categories as $category) { 
      foreach ($category->processes as $process) { 
       foreach ($process->cards as $card) { 
        foreach ($card->groups as $group) { 
         $group->upload; 
        } 
       } 
      } 
     } 

并使其成为一个或两个语句? 我正在使用Laravel的Eloquent ORM。

+0

告诉我们这些模型之间有什么关系,因为在这里急切的加载嵌套关系会运行5个查询,所以可能你需要以不同的方式做 –

回答

2

你可以做深度嵌套预先加载有:每个进程

Serie::with('categories.processes.cards.groups')->get(); 

这已经加载每个类别的所有进程,存储卡等

看那documentation

$books = Book::with('author.contacts')->get(); 

如果您想快速获得所有群组,请尝试:

$series = Serie::with('categories.processes.cards.groups')->get()->toArray(); 

$groups = array_pluck($series, 'categories.processes.cards.groups'); 

这将以阵列格式返回每个组的属性。您只需要找到一种新的方法在组对象上执行->upload()方法。

+0

我在做这件事的时候做错了什么。谢谢! –