Laravel withクエリーで個別フィールドのみクエリー
7188 ワード
1つ目の方法は、便利ですが、異なるテーブル関連に対して異なる関連フィールドを設定できないため、限界があります.
2つ目の方法は、クエリーを書くときに関連するフィールドを指定することです.
Laravelを使用する関連クエリーでは、
この場合、withを使用する場合、ターゲットに関連付けられたフィールドの一部のみをクエリーするには、次のテクニックを使用します.
しかし、検索のたびにこんなに煩雑に書いてあるのは本当にいいですか?Laravelの範囲クエリーを使用してカプセル化したほうがいいです.
Modelベースクラスで範囲クエリーを定義する(またはTraitを使用する)
通常のModelクラスでは、ベースクラスが継承されます.
そして使いやすくなります.
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();