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

时间:2015-05-17 12:56:04

标签: php count laravel-5

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

以下是表关系的设置方式。

我所拥有的是从类别到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');
}

实际上,我想要做的就是能够将每个类别的帖子总数返回到我的视图,如下所示。 x 是每个类别中的帖子数。

cat1( x
cat2( x
cat3( x

我知道这并不难,因为我只想要一个我不想检索记录的计数,因为它们不是必需的,我也不想创建超出必要的查询。 / p>

我还没有完成视图,但可能一开始就是在循环中传递类别以显示每个类别并同时添加计数?

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

希望这很清楚(ish)!

2 个答案:

答案 0 :(得分:8)

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

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

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

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

@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;
}

答案 1 :(得分:0)

使用渴望加载支持的最好方法我知道是创建一个与帖子计数分开的关系。看看这个:

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 }}