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

来源:互联网 发布:淘宝小二布置作业短信 编辑:程序博客网 时间:2024/06/01 09:46

第一种方法,很方便,但有局限性,因为这个不能针对不同表关联去设置不同的关联字段

public function childs(){    return $this->hasMany('App\Tree','parend_id','id')->select('id','parent_id','title');}

第二种办法如下,可以在写查询的过程中指定需要关联的字段

在使用 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();
0 0