Laravel 提供了 Eager Loading使用 with()方法來緩解 N+1 的問題指巡,但是在實(shí)際使用中還是存在一些問題的, with()會直接查詢出表中所有的字段隶垮,而我們可能僅僅需要其中指定的某幾個字段藻雪。
假如我們現(xiàn)在有兩張表: user和 posts,每個 User 可以擁有多個 Posts狸吞,而每一篇 Post 只能屬于一個 User勉耀。下面分別是 User Model 和 Post Model 中定義的關(guān)系:
// User.php public function post(){ return $this->hasMany('post');}
// Post.php public function user(){ return $this->belongsTo('user');}
通過 with()方法指煎,我們可以這樣獲取所有的 Posts 并同時查出對應(yīng)的 User 信息,可以使用這樣的方法:
public function getAllPosts() {
return Post::with('user')->get();
}
這實(shí)際上會執(zhí)行下面兩句 SQL 語句:
select * from posts
select * from users
where users
.id
in (<1>, <2>)
但是我們可能并不需要 User 表中所有的字段瑰排,例如我們只需要 id和 username兩個字段:
select * from posts
select id,username from users
where users
.id
in (<1>, <2>)
我們可以通過下面兩種方法來實(shí)現(xiàn)贯要。
方法一:在 with() 中指定 Post::with(array('user'=>function($query){ $query->select('id','username');}))->get();//注意 必須指定id
方法二:修改 Model 文件
修改 Post.php 文件中 user() 方法:
public function user(){ return $this->belongsTo('User')->select(['id','username']);}