Laravel は N+1 問題を軽減するために with() メソッドを使用した Eager Loading を提供しますが、実際の使用にはまだいくつかの問題があります。 with() はテーブル内のすべてのフィールドを直接クエリします。その中で指定された特定のフィールドのみが必要な場合があります。
ここで、ユーザーと投稿という 2 つのテーブルがあるとします。各ユーザーは複数の投稿を持つことができ、各投稿は 1 人のユーザーにのみ属することができます。ユーザーモデルと投稿モデルで定義されている関係は次のとおりです:
// User.php public function post(){ return $this->hasMany('post');}// Post.phppublic function user(){ return $this->belongsTo('user');}
with() メソッドを通じて、すべての投稿を取得し、同時に対応するユーザー情報を見つけることができます。このメソッド:
public function getAllPosts() { return Post::with('user')->get();}
これは実際に次の 2 つの SQL ステートメントを実行します:
select * from `posts`select * from `users` where `users`.`id` in (<1>, <2>)
ただし、User テーブルのすべてのフィールドは必要ない場合があります。たとえば、必要なのは User テーブル内のフィールドだけです。 id と username フィールド:
select * from `posts`select id,username from `users` where `users`.`id` in (<1>, <2>)
これは、次の 2 つの方法で実現できます。
Post::with(array('user'=>function($query){ $query->select('id','username');}))->get();
Post.php ファイルの user() メソッドを変更します:
public function user(){ return $this->belongsTo('User')->select(array('id', 'username'));}