美文网首页
laravel with 渴求式加载指定字段

laravel with 渴求式加载指定字段

作者: charmingcheng | 来源:发表于2020-01-16 13:55 被阅读0次

    在使用 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));
            }]);
        }
     
        public function scopeWithFilter($query, $relation, Array $columns)
        {
            return $query->with([$relation => function ($query) use ($columns){
                $query->where($columns));
            }]);
        }
       
    }
    
    

    在我们普通的 Model 类都继承基类:

    class Topic extends BaseModel{
        public function user()
        {
            return $this->belongsTo('User');
        }
    }
    
    

    然后使用就很方便了:

    $topics = Topic::limit(2)->withCertain('user', ['username'])->get();
    $topics = Topic::limit(2)->withFilter('user', ['username' => $username])->where('flag', $flag)->get();
    

    相关文章

      网友评论

          本文标题:laravel with 渴求式加载指定字段

          本文链接:https://www.haomeiwen.com/subject/ybjbwctx.html