これらのメソッドの背後にある概念と意味がやや分かりにくいと思いましたが、has
とwith
の違いは何かを私に説明することは可能ですか(可能であれば)。
with()
は積極的なローディングのためのものです。これは基本的に、メインモデルに沿って、Laravelが指定した関係をプリロードすることを意味します。あなたがモデルのコレクションを持っていて、それらすべてのためにリレーションをロードしたい場合、これは特に役に立ちます。積極的なロードでは、コレクション内のすべてのモデルに対して1つではなく、1つの追加のDBクエリのみを実行するためです。
例:
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