我的项目涉及使用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进行排序,我该如何调整?
答案 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']);