鉴于以下belongsToMany关系:
标签型号:
class Tag extends Model
{
public function posts (){
return $this->belongsToMany('App\Post');
}
}
发布模型:
class Post extends Model
{
public function tags (){
return $this->belongsToMany('App\Tag');
}
}
在laravel中查询每个标记计数的最有效和可扩展的方法是什么,并根据从最低到最高的标记计数进行排序?
答案 0 :(得分:3)
要获取代码及其计数,您需要加入代码表格,以便使用 post_tag 表格获取代码数据,以获取给定标签的次数用于标记帖子。您可以使用以下代码执行此操作:
// get Tag data and join with post_tag
$counts = Tag::join('post_tag', 'tags.id', '=', 'post_tag.tag_id')
// group by tags.id in order to count number of rows in join and to get each tag only once
->groupBy('tags.id')
// get only columns from tags table along with aggregate COUNT column
->select(['tags.*', DB::raw('COUNT(*) as cnt')])
// order by count in descending order
->orderBy('cnt', 'desc')
->get();
这将为您提供标记对象的集合。您会在 cnt 属性中找到计数。
答案 1 :(得分:2)
您可以使用withCount方法
如果您想计算没有关系的结果数 实际加载它们你可以使用withCount方法
$posts = App\Post::withCount('tags')->get();
foreach ($posts as $post) {
echo $post->tags_count;
}