1. ホーム
  2. ララベル

[解決済み】Laravel - Eloquent "Has", "With", "WhereHas" - これらの意味は何ですか?

2022-03-27 23:31:48

質問

これらのメソッドの背後にある概念と意味が少しわかりにくいのですが、誰かが私に説明することは可能ですか? haswith は、(可能であれば)例の文脈で教えてください。

どのように解決するのですか?

with() エージーロード . これは基本的に、メインモデルに沿って、Laravelが指定されたリレーションシップをプリロードすることを意味します。これは、モデルのコレクションがあり、それらすべてに対してリレーションをロードしたい場合に特に便利です。なぜなら、イーガーローディングでは、コレクション内の全てのモデルに対して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