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

Posted isykw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 在 with 查询中只查询个别字段相关的知识,希望对你有一定的参考价值。

在使用 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, 要么就返回空

以上是关于Laravel 在 with 查询中只查询个别字段的主要内容,如果未能解决你的问题,请参考以下文章

laravel中关联模型查询选择性的字段

从一对多关系 laravel 中只查询一行

如何在 Eloquent/Laravel 上查询子查询

Laravel Eloquent 在与其他表连接后从关系中选择字段

Laravel - 使用“with”和“where”子句进行选择的查询

Laravel - 如何通过关系来执行where查询?