$users = \DB::select("select * from users where date(created_at) >= '$date' AND (select COUNT(id) from user_segments where user_id=users.id AND segment='did_not_visit_for_2_days') < 1");
Выводит двух пользователей который создали аккаунт два дня назад, и при этом его нет в таблице user_segments
Переписал для eloquent
$users = \DB::table('users')
->whereDate('created_at', '>=', today()->subDays(2))
->where(function ($query) {
$sql = "(select COUNT(id) from user_segments where user_id=users.id AND segment='did_not_visit_for_2_days')";
$query->where(DB::raw($sql), '<', 1);
})
->get();
Также работает вроде бы корректно. Есть ли способы написать запрос более правильно?
использовать например Eloquent модели, тогда можно часть кода убрать
User::whereDate('created_at', '>=', today()->subDays(2)) ->where(function ($query) { $query->selectRaw('count(id)') ->from('user_segments') ->whereRaw('user_id=users.id') ->where('segment', 'did_not_visit_for_2_days'); }, '<', 1) ->get() Вот так
Обсуждают сегодня