在Laravel中按键按数组排序

时间:2018-10-22 10:52:02

标签: laravel sql-order-by

我正在使用以下查询从下表中获取匹配的ID,在这些表中,我只会得到student_id

有了这个student_id,我必须从students表中找到匹配的行,然后我要orderBy()students表中找到键(例如名称)。

我建立了student_mappingstudent模型之间的关系。

$mapps = Student_mapping::select('student_id');

if($request->session_id) {
    $mapps = $mapps->where('session', '=', $request->session_id);
}
if($request->class_id) {
    $mapps = $mapps->where('class_id', '=', $request->class_id);

    if($request->group_id) {
        $mapps = $mapps->where('group_id', '=', $request->group_id);

        if($request->section_id) {
            $mapps = $mapps->where('section_id', '=', $request->section_id);
        }
    }
}

$mapps = $mapps->get();

$students = [];

foreach($mapps as $map) {
    if($map->student)
    {
        $students[] = Student::find($map->student_id);
    }
}

我必须让$ students-> orderBy('name','ASC'),但是我不能这样做。

3 个答案:

答案 0 :(得分:1)

您可以使用User::where('id', $map->student_id)->orderBy('name', 'ASC');这似乎没有用,因为id仍然是唯一的。

另外,看起来您的代码将遭受多次对数据库的调用。

您可以将查询简化为:

$student_ids = $mapps->pluck('student_id');
$students = Student::whereIn('id', $student_ids)->orderBy('name', 'ASC')->get();
  

PS:雄辩的(模型)环绕QueryBuilder。参见example of ordering or groupby in the documentation

答案 1 :(得分:0)

获得这样的查询会更快,更好:

$students = Student::whereIn('id', $mapps)->orderBy('id')->get();

这将给您Collection个应按ID排序的所有学生。如果希望将其作为数组,请记住在集合上调用->toArray()方法,但无论哪种方式,它都应作为集合的目的。

答案 2 :(得分:0)

$students = [];

foreach($mapps as $map) {
    if($map->student)
    {
        $students[] = Student::find($map->student_id);
    }
}

通过laravel集合类see

return   collect($student)->sortBy('name')->values()->all();