2016-03-23 4 views
2

私は関係によってソートされたデータを使って雄弁に構築クエリを試しています。このDB構造を想像してみて:Laravel 5:単一レコードを返すときの関係別の順列

TABLE:駅

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()メソッドを使用して、どのように私はこの問題を克服できるということだと思いますか?

何か助けてくれてありがとう!

+0

私は質問を理解していないが、find()メソッドの代わりにget()メソッドを使用することはできません - > where( 'station.id'、 '='、110)? –

+2

レコードを1つしかロードしていない場合、注文するものはありません。あなたは、記録された記録を注文したいですか? –

+0

はい関連するレコードを注文したいので、$ query-> stationStatusにアクセスするとstatus_typeの説明になります – SirInfant

答えて

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); 

では、関連するオブジェクトを取得するconvienent方法ですが、それは参加を実行しません。新しいクエリを実行し、すべての要素をコレクションに添付します。 $q->orderBy(...)のように、独自のロジックをクエリに追加できます。

+0

これは関連する(eagreloaded)レコード( 'statusType')をソートします。 –

+0

はい、私は質問を誤解したと思います。 - > find(110)は私を投げ捨てました。 – devk

+0

これは正しく機能しません。実際にはSQLSTATE [42S22]:列が見つかりません:1054 'order clause'の 'description'が不明です – SirInfant

関連する問題