如何在Laravel中的大多数重复项中查询我的查询?

时间:2017-09-25 22:53:04

标签: php laravel

在我的网站上,用户可以发布图片。

图片可以包含标签。

这有4个表,images表,images_tag数据透视表,tag表,当然还有users表。

用户可以拥有多个具有相同标签的图像。

我可以使用此查询提取用户在其所有图像中使用的标记:

$userTags = Tag::whereHas('images', function($q) use($user) {
    $q->where('created_by', $user->id);
})->get();

但是,我想这样做,以便我可以根据用户使用它们的频率来订购这些标签。换句话说,我想按重复顺序排序。这可能吗?

1 个答案:

答案 0 :(得分:1)

为实现这一目标,您需要db.sqlite3 joinimages_tags表,计算代码数量,并按这些代码排序。

images

如果禁用$tags = Tag::selectRaw('tags.*, COUNT(images.id) AS total') ->join('images_tags', 'tags.id', '=', 'images_tags.tag_id') ->join('images', 'images.id', '=', 'images_tags.image_id') ->where('images.created_by', $user->id) ->groupBy('tags.id') ->orderBy('total', 'desc') ->get(); 选项,则上述查询仅适用于MySQL。否则,您将需要重写此项以使用子查询,或者在返回的Laravel only_full_group_by中进行排序。例如:

Collection

如果您想将此添加到您的用户模型,请根据您的评论创建一个类似于以下内容的功能:

$tags = Tag::selectRaw('tags.*, COUNT(images.id) AS total')
    ->join('images_tags', 'tags.id', '=', 'images_tags.tag_id')
    ->join('images', 'images.id', '=', 'images_tags.image_id')
    ->where('images.created_by', $user->id)
    ->groupBy('tags.id')
    ->get();

$tags = $tags->sortByDesc(function ($tag) {
    return $tag->total; 
});