如何在laravel中使用.each()过滤集合行?

时间:2017-05-28 11:14:27

标签: laravel laravel-collection

我想过滤这个$authors集合。

$authors = Author::get();

在我看来,我需要展示作者有多少本书 我使用.each()将count合并到$authors并将其返回到调用它的位置。

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

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

        });

问题是“如果作者没有写任何一本书(计数< = 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 个答案:

答案 0 :(得分:1)

您应该使用withCount()来避免N+1和性能问题:

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

在Blade视图中,您将能够:

$author->books_count
  

如果您想要计算关系中的结果数而不实际加载它们,您可以使用withCount方法,该方法会在结果模型上放置{relation}_count列。

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