我有2个Laravel模型,Classes
和Subjects
。每个班级属于一个主题。
我想做一个查询,根据主题的ID是否在给定的ID数组中对类进行排序和返回。
E.g。我可以成功使用下面的代码来获取具有相关主题ID的类列表。
但是,我无法弄清楚如何获取所有类(即没有过滤器),只需排序以便具有相关主题的类首先出现,然后是其他类。
一种方法是创建2个不同的集合,并->merge
它们,但在尝试分页时会变得棘手。
感谢您的帮助!
Classes::whereHas('subject',function($q) use ($subject_list) {
$q->whereIn('id', $subject_list);
})->get();
答案 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。