您的位置:首页 > 编程语言 > PHP开发

Laravel 在 with 查询中只查询个别字段

2017-04-28 09:13 288 查看
在使用 Laravel 的关联查询中,我们经常使用
with
方法来避免
N+1
查询,但是
with
会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的。

这时候我们可以使用下面的技巧在使用 with 时只查询目标关联的部分字段:

$topics = Topic::limit(2)->with(['user'=>function($query){
$query->select('id','username');
}])->get();


但是每次查询都写得这么繁琐真的好么?不如利用 Laravel 的范围查询将其封装起来:

在 Model 基类中定义一个范围查询(或者使用 Trait)

class BaseModel extends \Eloquent{
public function scopeWithOnly($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)->withOnly('user', ['username'])->get();


note:with查询结果空是因为你的查询字段不包含你的关联字段, 就比如 拿ID关联的话, 你就得 select() 里必须包含ID, 要么就返回空

转载自:https://laravel-china.org/topics/1220/laravel-queries-only-individual-fields-in-with-queries
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: