概要
LaravelのEloquentを用いて、リレーション先も含むデータを取得したい。
全てのカラムを取得したいのではなく、それぞれいくつかのカラムだけを指定して取得したい。
カラム指定がなければwith()を利用してリレーション先のデータが取得できるのに、カラム指定『select()やget([...])など』を利用するとなぜかリレーション先のデータが取得できない・・・。
解決策
select()に指定するカラムの中に外部キーを加えることで、リレーション先のデータの必要カラムも取得できた!!
具体例
groupsテーブル
id | name | created_at |
---|---|---|
1 | baseball | 1996-07-11 00:00:00 |
2 | soccer | 1996-07-11 00:00:00 |
3 | computer | 1996-07-11 00:00:00 |
4 | sciences | 1996-07-11 00:00:00 |
usersテーブル
id | name | group_id | age |
---|---|---|---|
1 | Mari | 1 | 22 |
2 | Hori | 1 | 25 |
3 | Sori | 2 | 48 |
4 | Tari | 1 | 88 |
大雑把ですが以上のようなデータがあり、groupsテーブルとusersテーブルが一対多の関係にあるとします。Laravelの場合だと、まずモデルにリレーション(hasManyとbelongsTo)の参照を記述すると思います。
ただデータを取ってくるだけならば何も問題はないのですが、例えばusersのageとgroupsのnameだけが欲しいって時があると思います。
// カラムを指定せずデータ取得
$groups = Group::with('users')->get();
// カラムを指定してデータ取得(失敗ver)
$groups = Group::with('users:age')->get(['name']);
// カラムを指定してデータ取得(成功ver)
$groups = Group::with('users:age,group_id')->get(['name', 'id']);
上の例をみてもらえれば、わかるように、外部キーを取得しないとどうやらリレーション先のデータは取れないようです。
今回の成功verでデータを所得すると、groupテーブルのname,idが取得できます。さらに、リレーション先のusersテーブルの関連するuserのageとgroup_idのみが表示されます。
※ with('users:age, group_id')のようにカラム名の間にスペースが空いているとうまいこと取れなかったので注意が必要。