在 Laravel with 查询只查询个别字段
在 Laravel with 查询只查询个别字段
在使用 Laravel
的关联查询中,我们经常使用 with
方法来避免 N+1
查询,但是 with
会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的。
这时候我们可以使用下面的技巧在使用 with 时只查询目标关联的部分字段:
$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();