美文网首页laravel
如何在 Laravel 只查询关联模型的个别字段?

如何在 Laravel 只查询关联模型的个别字段?

作者: 足迹人生2017 | 来源:发表于2018-10-08 11:16 被阅读410次

原文 https://laravel-china.org/wikis/16246

在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,接下来介绍一个能够读取关联模型个别字段的方法:

第一种方法

$topics = Topic::limit(2)->with('user:id,username')->get();
Topic::limit(2)->with('user:id,username', 'article:id,title')->get();

// 或

Topic::limit(2)->with(['user:id,username', 'article:id,title'])->get();
$users = User::limit(2)->with('articles:id,user_id,title')->get();

第二种方法

$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();

相关文章

网友评论

    本文标题:如何在 Laravel 只查询关联模型的个别字段?

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