Laravel 4按相关模型排序

时间:2014-03-06 21:43:23

标签: php sorting laravel eloquent

我的项目涉及使用Laravel 4进行医疗预约。每项预约都与医生,患者,身份以及一张或多张保险卡相关联。

到目前为止,这很有效:

$appointments = Appointment::
    with('doctor','patient','status','insurances')->
    orderBy($this->input['sidx'], $this->input['sord'])->
    paginate($this->input['rows']);

挑战在于,只有在我对约会的属性进行排序时,排序才有效。如果我想按doctor.last_name或patient.last_name进行排序,我该如何调整?

2 个答案:

答案 0 :(得分:0)

这很简单,只需要将关系名称的关键值数组作为键发送,将值作为闭包发送。

function cmpDoctor($a, $b)
{
    if ($a->doctor->last_name == $b->doctor->last_name) {
        return 0;
    }
    return (strtolower($a->doctor->last_name) < strtolower($b->doctor->last_name)) ? -1 : 1;
}

$appointments = Appointment::
    with(array('doctor' => function($q)
    {
        $q->orderBy('last_name')->first();
    },'patient' => function($q)
    {
        $q->orderBy('last_name');
    },'status' => function($q)
    {
        $q->orderBy('description');
    },'insurances' => function($)
    {
        $q->orderBy('some_col')
    }))->
    orderBy($this->input['sidx'], $this->input['sord'])->
    paginate($this->input['rows']);

usort($appointments, array($this, 'cmpDoctor'));

为了让这一点有意义,我假设每次预约只会有一位医生(如果每次预约都有一位以上医生,你会如何对医生进行排序?)

我在医生关系上使用first(),以防万一我的假设是错误的。

答案 1 :(得分:0)

Eloquent eager load Order by找到答案。 Luis Dalmolin的答案非常有效 - 这是使用JOIN的问题。

以下是最终结果:

    $appointments = Appointment::
        with('doctor','patient','status','insurances')->
        join('doctor', 'appointment.doctor_id', '=', 'doctor.id')->
        join('patient', 'appointment.patient_id', '=', 'patient.id')->
        join('status', 'appointment.status_id', '=', 'status.id')->
        orderBy($this->input['sidx'], $this->input['sord'])->
        paginate($this->input['rows']);