これらの方法の概念と意味が少しわかりにくいのですが、has
との違いをwith
例を挙げて説明していただくことは可能でしょうか (可能であれば)?
ベストアンサー1
と
with()
は、 Eager Loading用です。基本的には、メイン モデルに沿って、Laravel が指定したリレーションシップをプリロードすることを意味します。これは、モデルのコレクションがあり、それらすべてにリレーションシップをロードする場合に特に役立ちます。Eager Loading では、コレクション内のモデルごとに 1 つではなく、追加の DB クエリを 1 つだけ実行するためです。
例:
User > hasMany > Post
$users = User::with('posts')->get();
foreach($users as $user){
$users->posts; // posts is already loaded and no additional DB query is run
}
もっている
has()
関係に基づいて選択モデルをフィルタリングすることです。したがって、通常の WHERE 条件と非常によく似た動作をします。has('relation')
これを使用すると、この関係に少なくとも 1 つの関連モデルがあるモデルのみを取得することになります。
例:
User > hasMany > Post
$users = User::has('posts')->get();
// only users that have at least one post are contained in the collection
どこに
whereHas()
は基本的に と同じように動作しますhas()
が、関連モデルをチェックするための追加のフィルターを指定できます。
例:
User > hasMany > Post
$users = User::whereHas('posts', function($q){
$q->where('created_at', '>=', '2015-01-01 00:00:00');
})->get();
// only users that have posts from 2015 on forward are returned