以下是相关模型:
任务:
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之间分割,这是一个巨大的反模式。
答案 0 :(得分:1)
假设您对表名和列名使用合理的默认值,则可以执行以下操作:
$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();