Laravel Orderby与关系

时间:2019-07-24 02:08:17

标签: php laravel

我正在尝试使用带有OrderBy函数的关系方法按每个级别对学生列表进行排序,但是不幸的是,我无法使它起作用,我的代码中缺少什么?

注意: 每次我按我的代码删除订单都可以,但是学生级别却没有相应安排

控制器:

$students=Student::with('level')->where(['status' => 'ENROLLED'])->get()->orderBy('level_name','asc');

查看

<table>
        <tr>
            <th>Name</th>
            <th>Level</th>
        </tr>
         @foreach($students as $std)
        <tr>

              <td>
                    {{$std->student_name}}

              </td>  
             <td>
                 @foreach($std->level as $lv)
                   {{$lv->level_name}}
                 @endforeach
             </td>

        </tr>
         @endforeach
    </table>

3 个答案:

答案 0 :(得分:1)

尝试一下:

控制器:

$students = Student::with(['level' => function (Builder $query) {
    $query->orderBy('level_name', 'asc');
}])->where(['status' => 'ENROLLED'])->get();

此外,您可以将orderBy()添加到关联方法。

学生模型:

public function level()
{
    return $this->relationMethod(Level::class)->orderBy('level_name', 'asc');
}

答案 1 :(得分:0)

您无法通过关系进行订购,因为laravel在后台进行两个单独的查询。

您可以改用join,类似这样(请注意,我猜到您的表名了,所以您可能必须更新它们)。

$users = Student::join('levels', 'students.level_id', '=', 'levels.id')
  ->orderBy('levels. level_name', 'asc')->select('students.*')->paginate(10);

答案 2 :(得分:0)

尝试一下

$students=Student::with('level')->where(['status' => 'ENROLLED'])->orderBy('level_name','asc')->get();