Laravel withクエリーで個別フィールドのみクエリー

7188 ワード

1つ目の方法は、便利ですが、異なるテーブル関連に対して異なる関連フィールドを設定できないため、限界があります.
public function childs(){
    return $this->hasMany('App\Tree','parend_id','id')->select('id','parent_id','title');
}

2つ目の方法は、クエリーを書くときに関連するフィールドを指定することです.
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();