【问题标题】:how to sort results based on pivot table in laravel如何在laravel中根据数据透视表对结果进行排序
【发布时间】:2018-07-25 05:56:27
【问题描述】:

我有三个这样的表:

  • tour (id name) -> 假设 (id:1 , name : something)
  • meta (id key) ->assume (id:1 , key: tour_duration)
  • meta_tour (tour_id meta_id value) ->assume (tour_id:1 , meta_id:1 , value: 15)

这是多对多关系。

我想根据 meta_tour 表中的元值对旅游进行排序,如下所示:

tours orderBy tour_duration.value

更新

我试过这个:

        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);

但不工作。

【问题讨论】:

  • 有一个小问题:您正在尝试获取旅行列表,但由于每次旅行可以有多个元数据,因此您最终会得到包含重复旅行的列表,并且(我认为)除非您使用联接查询它,否则您无法得到它
  • 谢谢,你能给我看看加入的例子吗?我是新手,我不知道如何根据我的问题连接表。
  • 您想多次获得包含多个meta_tour 条目的导览吗?还是只有一次?
  • 我想获取所有具有元名称“tour_duration”的旅行。(每个旅行都有一个 tour_duration)并使用 tour_duration 值对旅行进行排序。

标签: php laravel eloquent pivot


【解决方案1】:

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

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

更新

要仅获取具有游览持续时间的元数据,请尝试预先加载并在元数据上添加 where 子句:

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

【讨论】:

  • 它不起作用..我想按 tour_duration 值排序,而不是每个项目的值。
  • 我添加了另一个示例来限制被查询的元数据。
【解决方案2】:

您可以使用修改后的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

【讨论】:

    【解决方案3】:

    试试:

    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();
    

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多