首页 文章

如何根据laravel中的数据透视表对结果进行排序

提问于
浏览
0

我有三个这样的表:

  • tour(id name) - > assume(id:1,name:something)

  • meta(id key) - > assume(id:1,key:tour_duration)

  • meta_tour(tour_id meta_id value) - >假设(tour_id:1,meta_id:1,值:15)

这是ManyToMany的关系 .

我想基于meta_tour表中的元值对游览进行排序,如下所示:

tours orderBy tour_duration.value

Update

我试过这个:

Tour::with(['metas' => function ($query) {
        $query->where('key', 'tour_duration')
        ->orderByDesc('value');
        }])->paginate(15);

还有这个 :

Tour::with(['metas' => function ($query) {
        $query->where('key', 'tour_duration');
        }])->orderByDesc('value')->paginate(15);

还有这个 :

Tour::whereHas('metas' , function ($query) {
        $query->where('key', 'tour_duration')
              ->orderBy('value', 'desc')
        })->paginate(15);

但没有工作 .

3 回答

  • 0

    您可以使用修改后的 withCount()

    Tour::withCount(['metas as tour_duration' => function ($query) {
        $query->select('meta_tour.value')->where('key', 'tour_duration');
    }])->orderByDesc('tour_duration')->paginate(15);
    

    这使用子查询从数据透视表中获取 value

    select `tours`.*,
      (select `meta_tour`.`value`
       from `metas`
       inner join `meta_tour` on `metas`.`id` = `meta_tour`.`meta_id`
       where `tours`.`id` = `meta_tour`.`tour_id`
         and `key` = 'tour_duration') as `tour_duration`
    from `tours`
    order by `tour_duration` desc
    
  • 0

    您可以使用 withPivot 方法按透视表列进行排序:

    // Tour model
    public function meta () {
        return $this->belongsToMany(Meta::class)
                    ->withPivot('meta_tour')
                    ->orderByDesc('meta_tour.value');
    }
    

    Update

    要仅获取具有巡视持续时间的元数据,请尝试急切加载并在元数据上添加where子句:

    $tour->with(['meta' => function ($query) {
        $query->where('key', 'tour_duration');
    }])->orderByDesc('meta.value')->get();
    
  • 1

    尝试:

    Tour::join('meta_tour', 'meta_tour.tour_id', '=', 'tour.id')
        ->join('meta', 'meta_tour.meta_id', '=', 'meta.id')
        ->where('meta.key', '=', 'tour_duration')
        ->orderBy('meta_tour.value', 'DESC')
        ->get();
    

相关问题