我想知道什么是计算与我的博客中连接到类别的帖子数的最清洁方法。
这是如何建立表的关系。
我拥有的是 Hasmany 从类别到这样的帖子模型的关系:
in 类别模型
public function blog_posts()
{
return $this->hasMany('AppHttpModelsBlog_Post', 'category_id');
}
和 blog_post 模型
public function blog_categories()
{
return $this->belongsTo('AppHttpModelsBlogCategories', 'category_id');
}
实际上我要做的就是能够返回我的视图,每个类别具有如下所示的帖子总数。其中 X 是每个类别中的帖子数。
cat1( x )
cat2( X )
CAT3( X )
我知道,这并不难计算,因为我只想要一个我不想检索记录,因为它们不需要,而且我也不想创建比必要的更多查询。
我尚未完成视图,但可能的开始可能是通过循环中的类别显示每个类别并同时添加计数?
@foreach ($categories as $category)
{!! $category->name !!} - {!! Count of posts here !!}
@endforeach
希望这很清楚(ish)!
急切的控制器中的关系:
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;
}
我知道,急切的加载支持的最佳方法是与邮政计数建立单独的关系。检查一下:
public function blog_posts_count() {
return $this->hasOne('AppHttpModelsBlog_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 }}