Laravelでリレーション先で検索することがあったため備忘録。
例えば下記のようなモデルがあったとします。
User.php
class User extends Model
{
public function project()
{
return $this->belongsTo('App\Project');
}
}
Project.php
class Project extends Model
{
public function organization()
{
return $this->belongsTo('App\Organization');
}
}
※主キーはidとします。
リレーション先で検索
Userからリレーション先であるProjectのorganization_idで絞り込みたいとします。
- whereHasを使用する場合
UserController.php
$Users = User::whereHas('project', function ($query) use ($request) {
$query->where('organization_id', $request->organization_id);
})->get();
- whereHasを使用しない場合
UserController.php
$Users = User::whereIn('project_id', function ($query) use ($request) {
$query->from('projects')
->select('id')
->where('organization_id', $request->organization_id);
})->get();
リレーション先のリレーションで検索
Userからリレーション先であるProjectのリレーション先のOrganizationのnameで絞り込みたいとします。
- whereHasを使用する場合
UserController.php
$Users = User::whereHas('project', function ($query) use ($request) {
$query->whereHas('organization', function ($query) use ($request) {
$query->where('name', $request->organization_name);
}
})->get();
- whereHasを使用しない場合
UserController.php
$Users = User::whereIn('project_id', function ($query) use ($request) {
$query->from('projects')
->select('id')
->whereIn('organization_id', function ($query) use ($request) {
$query->from('organizations')
->select('id')
->where('name', $request->organization_name);
});
})->get();
他により良い方法などありましたらご教示いただけますと幸いです。