Laravel 5:如何订购,取决于whereHas?

时间:2018-02-06 05:22:26

标签: php laravel laravel-5

我有2个Laravel模型,ClassesSubjects。每个班级属于一个主题。

我想做一个查询,根据主题的ID是否在给定的ID数组中对类进行排序和返回。

E.g。我可以成功使用下面的代码来获取具有相关主题ID的类列表。

但是,我无法弄清楚如何获取所有类(即没有过滤器),只需排序以便具有相关主题的类首先出现,然后是其他类。

一种方法是创建2个不同的集合,并->merge它们,但在尝试分页时会变得棘手。

感谢您的帮助!

Classes::whereHas('subject',function($q) use ($subject_list) {
    $q->whereIn('id', $subject_list);
})->get();

2 个答案:

答案 0 :(得分:2)

您可以执行leftJoin来获取所有类(即没有过滤器),只需排序以便具有相关主题的类首先

Classes::leftJoin('subjects', function ($join) use ($subject_list) {
            $join->on('classes.subject_id', '=', 'subjects.id')
                 ->whereIn('subjects.id', $subject_list);
        })
        ->orderBy('classes.subject_id')
        ->get();

答案 1 :(得分:1)

whereHas()在这里不会帮到你。您可以使用sortByDesc()

$classes = Classes::all();
$classes->sortByDesc(function($i) use($subject_list) {
    return in_array($i->subject_id, $subject_list);
});

或者您可以执行两个查询并合并结果:

$classes = Classes::whereIn('subject_id', $subject_list)->get();
$classesNotIn = Classes::whereNotIn('subject_id', $subject_list)->get();
$classes->merge($classesNotIn);

我测试了这两种方法并且它们都有效,但您需要在两种情况下手动创建Paginator。