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