[Laravel] 子テーブルの情報を簡単に取得するwith

親子関係にある子テーブルのデータを簡単に取得できるメソッドがLaravelには用意されています。with関数を使えば発行するクエリーが少なくなり、システムへの負荷も抑えながらデータを取得することができます。このような関数を使って開発スピードを上げることができるのがフレームワークの良さですね。
公式ドキュメントに詳しい解説があります。
Laravel公式サイト Eloquent-rRelationships Eager-Lording
Contents
リレーションシップの確認
下記のようなモデル(テーブル)とリレーションシップを作成しておきます。
・BookとAuthorモデルがある
・Bookモデルに下記を指定
1 |
return $this->belongsTo('App\Author'); |
・コントローラーでuse App\Post;を指定
1つのリレーションシップを指定
1 |
$books = Book::with('author')->get(); |
この一行で2つのクエリが生成され、authorのデータも取得できます。
select * from books
select * from authors where id in (1, 2, 3, 4, 5, …)
複数のリレーションシップを指定
複数のリレーションシップが設定されている場合は配列で指定するだけで、複数の子テーブルのデータの取得が可能です。
1 |
$books =Book::with(['author', 'publisher'])->get(); |
ネストされたテーブルデータを取得
本テーブル(book)と著者テーブル(author)、そして著者と著者の詳細テーブル(contacts)の3つがリレーションされているとします。これらのデータを一括で取得するにはドット構文を利用します。
1 |
$books = Book::with('author.contacts')->get(); |
カラムを指定して取得
カラムを指定してのデータ抽出です。idは必ず含めなければならないというルールがあります。
1 |
$users = Book::with('author:id,name')->get(); |
条件指定して取得
functionでクエリを指定するとwhere句を利用することができます。
1 2 3 |
$users = User::with(['posts' => function ($query) { $query->where('title', 'like', '%first%'); }])->get(); |
ソートして取得
ソートも条件指定と同様にfunctionでクエリを指定します。
1 2 3 |
$users = User::with(['posts' => function ($query) { $query->orderBy('created_at', 'desc'); }])->get(); |
関連記事
- [CakePHP] 独自SQLのAS句で新しいフィールドを作りCakePHPの形式でデータを出力する方法
- [CakePHP] 独自のSQL文を利用する方法
- [Laravel] MySQLのリレーションにおける型
- [CakePHP] 独自のSQL文でプリペアドステートメントを使う方法
- [Laravel] Seederを使ってテストデータを挿入