やりたいこと
リレーションしたものを取得するとき
select *
と全カラム対象になるのでこれをやめる
前提
UserとPostが存在し、関係はユーザが複数の投稿を保持
public function posts()
{
return $this->hasMany(Post::class)
}
やりかた1
withで呼び出す際にカラム名を追記する
User::with(['posts:user_id,name'])->get()
リレーションするための外部キーをセレクトに入れないといけないので注意
やりかた2
withで呼び出す際にクエリビルダを呼び出す
User::with(['posts' => function($query){
$query->select(['user_id','name']);
}])->get()
クエリスコープも使えるのでもう少しコンパクトにできる。
// Postモデルにスコープ定義
public function scopeDefaultSelect($query)
{
return $query->addSelect(['user_id','name']);
}
User::with(['posts' => function($query){
$query->defaultSelect();
}])->get()
where条件なども使えるし、良き
やりかた3
リレーション時に指定しておく
// Postモデルにスコープ定義
public function scopeDefaultSelect($query)
{
return $query->addSelect(['user_id','name']);
}
public function posts()
{
return $this->hasMany(Post::class)->defaultSelect();
}
なにも意識しなくても、defaultSelct
が使用されるしaddSelect
を使用していれば、
別途ほかのカラムが欲しいときに、やりかた2の方法で追加できる