这些是相关的模型:
任务:public function resolution() {
return $this->hasOne('Resolution');
}
的决议:
protected $primaryKey = 'task_id';
public $incrementing = false;
public function task() {
return $this->belongsTo('Task');
}
因此,我有以下代码:
$tasks = Task::with(array(
'... some relations ...'
))->whereHas('status', function($q) use($include) {
$q->whereIn('slug', $include);
})->get()->sortByDesc(function($task) {
return ($task->resolution->end ? $task->resolution->end : Carbon::now()->toDateTimeString());
});
这将返回我想要的结果集合,并具有正确的顺序,但是排序发生在检索到所有行之后。
我需要的是在检索数据之前,根据关系resolution
(如上所示)对结果进行排序,然后执行->take(50)
,因为将有成千上万的行来自该表,该函数将非常慢。
在Eloquent中可以吗?因为我不想让代码在Eloquent和DB:Raw之间分割,这是一个巨大的反模式。
假设您的表名和列名使用合理的默认值,您可以这样做:
$tasks = Task::with(array(
'... some relations ...'
))
->whereHas('status', function($q) use($include) {
$q->whereIn('slug', $include);
})
->join('resolutions', 'tasks.id', '=', 'resolutions.task_id')
->orderBy('resolutions.end', 'desc')
->get();