Laravel 5.3 Ограничение надежных нагрузок не работает

У меня есть две модели 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();