在使用 Laravel 的关联查询中,我们经常使用 with
方法来避免 N+1
查询,但是 with
会将目标关联的所有字段全部查询出来,接下来介绍一个能够读取关联模型个别字段的方法:
第一种方法
$topics = Topic::limit(2)->with('user:id,username')->get();
Topic::limit(2)->with('user:id,username', 'article:id,title')->get();
// 或
Topic::limit(2)->with(['user:id,username', 'article:id,title'])->get();
$users = User::limit(2)->with('articles:id,user_id,title')->get();
第二种方法
$topics = Topic::limit(2)->with(['user'=>function($query){
$query->select('id','username');
}])->get();
接下来我们利用 Laravel 的 范围查询 将其封装起来,在 Model 基类中定义一个范围查询:
class BaseModel extends \Eloquent {
public function scopeWithCertain($query, $relation, Array $columns)
{
return $query->with([$relation => function ($query) use ($columns){
$query->select(array_merge(['id'], $columns));
}]);
}
}
在我们普通的 Model 类都继承基类:
class Topic extends BaseModel {
public function user()
{
return $this->belongsTo('User');
}
}
然后使用就很方便了:
$topics = Topic::limit(2)->withCertain('user', ['username'])->get();
网友评论