Laravel でネストした Eager Load + カラムの絞り込み
はじめに
Laravel でネストした構造(リレーション)において、取得するカラムを絞りつつ Eager Load する方法についてまとめた。
TL;DR
- カラムの絞り込み:
:
の後に,
区切りでカラムを列挙 - ネスト構造:
.
で繋げる - 上記の組合せ:
with
に渡す引数を分けて書くwith(['posts:title', 'posts.images:url'])
目次
環境・条件
1 | $ sw_vers |
詳細
前置き: Eager Loading について
Eager Loading - Eloquent:リレーション 5.8 Laravel
カラムの絞り込み
Eager Load 時に取得するカラムを絞り込むには、table:col1,col2,...
のように :
の後に ,
区切りでカラムを列挙すれば良い。
1 | User::with([ |
ネスト構造
ネストした構造を Eager Load するには .
で繋げると良い。
1 | User::with([ |
本題: ネスト構造 + 絞り込み
では、ネストした構造で各テーブルの取得カラムを絞り込むには?
最下層だけで良いなら組み合わせて下記でいける。
1 | User::with([ |
しかし、下記だと Column not found: 1054 Unknown column 'title.images' in 'field list'
という感じで、title.images
がカラムと認識されてしまいエラーになる。
1 | User::with([ |
こういうケースでは、配列の要素を分けると上手くいく。
1 | User::with([ |
ちなみに Has Many 関係の場合は問題ないが、Belongs To 関係の場合には外部キーも含めないと上手く取得できないので注意。
1 | // OK |
これは select()
でカラムを絞る場合も同様。
1 | // OK |
まとめ
- カラムの絞り込み:
:
の後に,
区切りでカラムを列挙 - ネスト構造:
.
で繋げる - 上記の組合せ:
with
に渡す引数を分けて書くwith(['posts:title', 'posts.images:url'])
参考文献
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア