Laravel 4 - SortBy关系字段

时间:2014-07-24 10:31:40

标签: php laravel laravel-4 eloquent

以下是相关模型:

任务:

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之间分割,这是一个巨大的反模式。

1 个答案:

答案 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();