Laravel - belongsToMany有效标签数量?

时间:2016-01-11 20:10:41

标签: php laravel laravel-5 eloquent

鉴于以下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中查询每个标记计数的最有效和可扩展的方法是什么,并根据从最低到最高的标记计数进行排序?

2 个答案:

答案 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;
}