Laravel Mongo GroupBy并以有效的方式统计

时间:2017-08-14 01:17:51

标签: mongodb laravel eloquent aggregation-framework

我有一个authors集合,与posts集合有多对多的关系。 posts集合有一个category字段,例如," Suspense"," Drama"," Action"等等。

我需要通过posts字段浏览整个category集合和分组,并且还有相关的计数。

这是我到目前为止所做的:

 $authors = Author::where('active', true)->get();

        foreach ($authors as $author){
            foreach ($author->posts()->groupBy('category')->get() as $data){

                // Do some logic

            }
        }

基本上我期望的输出是一个数组,category作为键,计数作为值。因此,如果我$a['Drama'],它会让我知道作者写了一篇具有该类别的帖子的次数。

我可以通过上面的循环逻辑来解决这个问题,但它看起来效率不高。我应该看看聚合吗?如果是这样,有人可以让我开始吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;

$authors = DB::collection('authors')
    ->where('active', true)
    ->get();

// Laravel >= 5.3 would return collection instead of plain array
$authors = is_array($authors) ? Collection::make($authors) : $authors;

$authors->map(function ($author) {
    return $author
        ->posts()
        ->groupBy('category')
        ->get()
        ->map(function ($collection) {
            return $collection->count();
        });
});