У меня есть две модели User
и Profile
в отношениях один к одному.
Я хочу получить всех пользователей, где profile.status == TRUE
используя следующий код.
$users = User::with(['profile' => function ($query) { $query->where('status', TRUE); }])->get(); dd(count($users)); //50
У меня 50 пользователей, и только среди них только 3 имеет status == TRUE
. Но всегда он отображает 50 .
Вы получаете 50 пользователей, потому что вы применяете условие к profile
. dd($user->profile)
вы получите только записи профиля, статус которого истинен.
Использовать whereHas()
:
$users = User::whereHas('profile', function ($query) { $query->where('status', TRUE); })->get(); dd(count($users));
Если вы хотите, чтобы он работал с одним запросом, вы можете использовать соединение Query Builder как
\DB::table('users')->join('profile', function ($join){ $join->on('users.id', '=', 'profile.user_id')->where('profile.status', '=',TRUE); })->get();
Вы сказали, что у вас проблема с N + 1, поэтому вам нужно использовать оба whereHas()
и with()
этого, чтобы получить пользователей с профилями и решить проблему N + 1:
$users = User::whereHas('profile', function ($query) { $query->where('status', TRUE); }) ->with('profile') ->get();