web-dev-qa-db-ja.com

Laravel - 説得力のある "Has"、 "With"、 "WhereHas" - どういう意味ですか?

これらのメソッドの背後にある概念と意味がやや分かりにくいと思いましたが、haswithの違いは何かを私に説明することは可能ですか(可能であれば)。

162
user4898812

あり

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
430
lukasgeiter