按标签系统排序

时间:2017-08-25 19:37:23

标签: laravel laravel-5.4

我的网站上有一个标记系统,点击标记会将您带到与该标记相关联的项目列表。我想订购这些物品(击球手),这些物品是由评价过的用户给出的最高平均评分,所以与标签相关的评分最高的击球手首先显示。我该怎么做?

我的桌子:

Batsmen:id,name,Country_id,评论:id,rating,comment,Batsmen_id tag:id,tagname Batsmen_tag(many to many table):batsmen_id,Tag_id

目前我只是在我的Tag控制器中找到所有标签($ id),并使用带有关系的foreach来带回与该标签相关的击球手,例如。

返回batsmen和HTML的当前TagController代码:controller:

    public function show($id) 
    { // $tag = Tag::find($id);

 return view('tags.show')->withTag($tag);
 }

HTML:

@foreach($tag->batsmen as $tags)

@endforeach 

这就是我如何找回与标签无关的batsmens以及我如何在最高AVG上订购它们:

$Batsmen = Batsmen::where('approved', '=', 1)
->leftJoin('reviews', 'reviews.batsmen_id', '=', 'batsmen.id')
->select('batsmen.*', DB::raw('AVG(ratings) as ratings_average' ))
->groupBy('id')
->orderBy('ratings_average', 'DESC')
->get();

那么我如何将两者结合起来并拉回与标签相关的击球手并按最高平均数排序呢?

1 个答案:

答案 0 :(得分:2)

你可以急切地在控制器中加载击球手:

$tag = Tag::with(['batsmen' => function ($query) {
    return $query->where('approved', '=', 1)
           ->leftJoin('reviews', 'reviews.batsmen_id', '=', 'batsmen.id')
           ->select('batsmen.*', DB::raw('AVG(ratings) as ratings_average' ))
           ->groupBy('id')
           ->orderBy('ratings_average', 'DESC');
}])->where('id', $id)->first();