はじめに
今回はwithメソッド
の使い方について学んだので、ご紹介します。
環境
- Laravel:8.83.4
1. withメソッドを使ってリレーション先のデータを取得する
以前書いた記事のUserモデルを使って進めていきます。
1-1. リレーションが1つの場合
$users = App\User::with('posts')->get();
withメソッド
の引数にはモデルで定義したリレーションメソッド名を文字列で指定します。
今回の場合、Userモデルにpostsメソッド
を定義したので、'posts'
と指定します。
1-2. リレーションが複数ある場合
$users = App\User::with(['posts', 'target'])->get();
withメソッド
の引数に配列を渡すことで複数のリレーションデータを取ることができます。
1-3. ネストしたリレーションの場合
Postモデル
に下記のようなリレーションを定義した場合、
app/Models/Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//略
/**
* リレーション - commentsテーブル
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function comments(): HasMany
{
return $this->hasMany(Comment::class);
}
//略
}
$users = App\User::with('posts.comments')->get();
.
でつなぐことでネストしたリレーション先のデータを取得することができます。
1-4. 指定したカラムのみ取得したい場合
$users = App\User::with('posts:id,user_id,title')->get();
:
の後に取得したいカラムを指定することで特定のカラムを取得することができます。
1-5. 条件を追加したい場合
$users = App\User::with(['posts' => function ($query) {
$query->where('content', 'like', '%good%');
}])->get();
取得するリレーションデータに条件を追加して限定したい場合は、withメソッド
の中でクロージャを使うことで実現できます。
上記はcontent
にgood
を含むリレーションデータだけをEagerロードしたいという場合を想定しています。
2. おわりに
withメソッド
にはさまざまな使い方があることがわかりました。
今回は割愛しましたが、特定の条件下でのみEagerロードしたい場合にはloadメソッド
が利用できるので、うまく使い分けていきたいです。
3. 参考文献