Laravel 5 - 计算博客中分配给每个类别的帖子数

Laravel 5 - Count the number of posts that are assigned to each category in a blog

我想知道在我的博客中计算与某个类别相关的帖子数量的最简洁方法是什么。

下面是 table 关系的建立方式。

我拥有的是从类别到 Post 模型的 hasMany 关系,如下所示:

类别模型

public function blog_posts()
{
    return $this->hasMany('App\Http\Models\Blog_Post', 'category_id');
}

并且在 Blog_Post 模型中

public function blog_categories()
{
    return $this->belongsTo('App\Http\Models\BlogCategories', 'category_id');
}

实际上我想做的就是能够 return 我查看每个类别的帖子总数,如下所示。其中 x 是每个类别中的帖子数。

cat1 (x)
cat2 (x)
cat3 (x)

我知道这并不难计数,但是因为我只想要一个计数,所以我不想同时检索记录,因为它们不是必需的,我也不想创建不必要的查询。

我还没有完成视图,但可能首先要循环遍历类别以显示每个类别并同时添加计数?

@foreach ($categories as $category)
    {!! $category->name !!} - {!! Count of posts here !!}
@endforeach

希望这很清楚!

我知道使用预先加载支持的最好方法是创建与 post 计数的单独关系。看看这个:

public function blog_posts_count() {
    return $this->hasOne('App\Http\Models\Blog_Post', 'category_id')
        ->selectRaw('category_id, count(*) as aggregate')
        ->groupBy('category_id');
}

public function getBlogPostsCountAttribute() {
    if(!array_key_exists('blog_posts_count', $this->relations))
        $this->load('blog_posts_count');

    $related = $this->getRelation('blog_posts_count');
    return $related ? (int) $related->aggregate : 0;
}

用法很简单:

{{ $category->blog_posts_count }}

急切加载控制器中的关系:

public function index()
{
    $categories = Category::with('blog_posts')->get();

    return view('categories.index', compact('categories'));
}

然后您可以在 blog_posts 关系上使用 count() 方法,当在您的视图中循环遍历类别时:

@foreach ($categories as $category)
    <li>{{ $category->name }} ({{ $category->blog_posts->count() }})</li>
@endforeach

编辑:由于 Laravel 5.3,您可以使用 withCount() 加载关系计数,即

$categories = Category::withCount('blog_posts')->get();

这将使计数可用 属性:

foreach ($categories as $category) {
    $blog_posts_count = $category->blog_posts_count;
}