2017-05-28 48 views
1

我想過濾這個$authors集合。如何在laravel中使用.each()時過濾收集行?

$authors = Author::get(); 

在我看來,我需要顯示作者與多少本書有關。
我使用.each()合併count$authors並將其返回到它被調用的位置。

return $authors->each(function($author, $key){ 

      $author->count = Author::findOrFail($author->id)->books()->count(); 

     }); 

的問題是「我怎樣才能刪除/過濾器,如果作者沒有任何wrriten一本書(計數< = 0)?」

我試過這個,它失敗了。

return $authors->each(function($author, $key){ 

       $author->count = Author::findOrFail($author->id)->books()->count(); 
       $author->filter(function($author, $key){ 
        return $author->count <= 0; 
       }) 

      }); 

回答

1

您應該使用withCount()避免N+1和性能問題:

$authors = Author::withCount('books')->get(); 

在刀片觀點,你就可以做到:

$author->books_count 

如果你想要計算一段關係的結果數量而不實際加載它們,可以使用withCount方法, h會在您的結果模型上放置一個{relation}_count列。

https://laravel.com/docs/5.4/eloquent-relationships#counting-related-models

+0

確定...我只是忘了在我的問題的一些代碼(更新現在)。 – Zugor

+0

這是一個很好的信息。但是,如果計數值爲零,我如何刪除/篩選行。 – Zugor

+1

@HeinHtutAung只需添加簡單的條件,如@if($ author-> books_count)'來檢查作者是否有書。或者你可以跳過用' - > has('books')'加載沒有書籍的作者。如果你想過濾數據,使用'filter()'方法。 –