2017-04-07 12 views
2

は同じ動作Laravelで直接関係にアクセスしてwithとの違いは何ですか?

$user1 = User::find(1); 
$user2 = User::with('roles')->find(1); 

どちら上記の方法以下のようにIは、ユーザの詳細情報を取得することができ、モデル

class User { 
    public function roles() 
    { 
     return $this->hasMany('Roles'); 
    } 
} 

以下の検討します。 with('roles')を使用しなくても、その特定のユーザーのrolesにアクセスできます。

echo $user1->roles; // Outputs all the roles of that user 

私の質問は、with('relation')を使用した実際の違い/利点は何ですか?

+0

'User :: with( 'roles') - > find(1);' 'with'を使用しているときは' EAGER LOADING'と呼ばれます。 '$ user1-> roles;を使っているときは' LAZY LOADING'と呼ばれます。詳細はhttps://laravel.com/docs/5.4/eloquent-relationships#constraining-eager-loadsおよびhttps://laravel.com/docs/5.4/eloquent-relationships#lazy-eager-loadingを参照してください。 –

答えて

2

eager loadingにはwith()関数が使用されます。 1人のユーザーを読み込むとき、これはほとんど影響を与えません。 rolesプロパティを取得しようとすると、このユーザーのロールを取得するためのクエリが実行されますが、このユーザーに対してのみ実行されます。

データベースからユーザーリストを読み込むことを検討してください。これらのユーザーごとにrolesプロパティを呼び出すと、すべてのユーザーに対してクエリが実行されます。これは良い仕事ではありません。
with()関数を使用すると、リレーションは熱心に読み込まれます。つまり、Laravelはすべてrolesを1つのクエリで読み込み、それらを正しいユーザーオブジェクトに割り当てます。今すぐユーザーオブジェクトのrolesプロパティを呼び出すと、値は既に読み込まれており、追加のデータベースクエリは必要ありません。クエリの量を2に減らします。

関連する問題