首页 文章

Laravel 5:Eloquent - 返回单个记录时按关系排序

提问于
浏览
2

即时尝试使用按关系排序的数据在eloquent中构建查询 . 想象一下这个DB结构:

TABLE: Station

id
name
...

TABLE: station_status:

id
station_id
status_type_id
date
...

TABLE: status_type:

id
description
...

MODELS

class Station extends \Eloquent
{
    public function stationStatus() {
        return $this->hasMany('App\StationStatus', 'station_id', 'id');
    }
}

class StationStatus extends \Eloquent
{
    public function statusType() {
        return $this->hasOne('App\StatusType', 'id', 'status_type_id');
    }
}

class StatusType extends \Eloquent
{
    ...
}

现在的问题 . 如何按站ID查询站模型,但按相关状态类型描述排序?

到目前为止,我有:

// This just do not work
$query = Station::join('station_status', 'station.id', '=',   'station_status.station_id')
    ->join('status_type', 'station_status.status_type_id', '=', 'status_type.id')
    ->orderBy('status_type.description', 'ASC')
    ->select(['stations.*'])
    ->with(['stationStatus.statusType']
    ->find(110);

我认为问题是我不是使用find()方法返回集合而只是一个项目,我该如何克服这个问题?

非常感谢您的帮助!

1 回答

  • 1

    试试这个:

    $query = Station::with(['stationStatus' => function($q){
        $q->join('status_type', 'station_status.status_type_id', '=', 'status_type.id')
        ->orderBy('status_type.description', 'ASC');
    }])->find(110);
    

    使用是一种获取相关对象的便捷方式,但它不执行连接 . 它执行新查询并将所有元素附加到您的集合中 . 您可以将自己的逻辑添加到查询中,就像我使用 $q->orderBy(...) 一样 .

相关问题