9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelのEloquentでリレーション先のデータも含めて取得カラムを指定したい!!

Last updated at Posted at 2019-07-04

概要

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')のようにカラム名の間にスペースが空いているとうまいこと取れなかったので注意が必要。

参考

Laravel 5.5 withで特定カラムを取得する

Laravel 5.7 Eloquent:リレーション: eagerローディング

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?