2014-04-15 117 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

我在做這件事的時候做錯了什麼。謝謝! –