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

Php Laravel 5-计算分配给博客中每个类别的帖子数量,php,count,laravel-5,Php,Count,Laravel 5,我想知道什么是最干净的方法来计算连接到我博客中某个类别的帖子的数量 下面是如何设置表关系的 我所拥有的是从类别到后期模型的许多关系,如下所示: 分类模型 在Blog_Post模型中 实际上,我想做的就是能够返回到我的视图中,每个类别的帖子总数如下所示。其中x是每个类别内的职位数量 第1类x 第2类x cat3 x 计数并不难,但我知道,因为我只需要一个计数,我不想检索记录,因为它们不是必需的,我也不想创建比需要更多的查询 我还没有完成视图,但可能一个开始是在循环中通过类别来显示每个类别,同时添加

我想知道什么是最干净的方法来计算连接到我博客中某个类别的帖子的数量

下面是如何设置表关系的

我所拥有的是从类别到后期模型的许多关系,如下所示:

分类模型

在Blog_Post模型中

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

第1类x 第2类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 }}

在控制器中加载关系:

公共功能指数 { $categories=categority::with'blog_posts'->get; 返回视图'categories.index',压缩'categories'; } 然后,在视图中循环浏览类别时,可以使用blog_posts关系上的count方法:

@foreach$类别作为$类别 {{$category->name}{{$category->blog_posts->count} @endforeach 编辑:从Laravel 5.3开始,您可以使用withCount加载关系的计数,即

$categories=Category::withCount'blog_posts'->get; 这将通过以下属性使计数可用:

foreach$类别作为$类别{ $blog\u posts\u count=$category->blog\u posts\u count; }
完美马丁谢谢,在我多年前用PHP开发的旧版应用程序上,我不知何故设法让它运行了大量的查询@Holo最有可能是N+1问题;哦,当然,多年前我的代码中有太多不好的东西,这让我过度分析了一切,而不仅仅是相信我比我想象的更了解拉威尔。今天早上还在亚马逊上订购了你的书:@Holo真的吗?太棒了!希望你喜欢:我相信我会的,我会接受所有我能得到的帮助,你的书似乎对我很理想。对于阅读本文的其他人,马丁斯的书就在这里>>哦,当然!当我写这篇文章时,我看了一下我的一个老项目,但我完全忘记了我在哪里找到了它所基于的解决方案。以下是网址:
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 }}