#sql #laravel #query-builder
#sql #laravel #конструктор запросов
Вопрос:
У меня есть этот SQL-запрос, но я понятия не имел, как записать его в Laravel Query Builder
select state_id, state_name, sum(inactifs) as inactifs, sum(actifs) as actifs,
sum(inactifs) sum(actifs) as total
from
(
select distinct s.id as state_id, s.name as state_name, u.id as user_id,
case when uga.id is null then 1 else 0 end as inactifs,
case when uga.id is null then 0 else 1 end as actifs
from users u
inner join states s on u.state_id = s.id
left join user_group_affiliations uga on uga.user_id = u.id
and (uga.active = 1 and (uga.start_date is null or uga.start_date <= now()) and (uga.end_date is null or uga.end_date >= now()))
) quer group by state_id;
Ответ №1:
Используйте DB::raw()
$users = DB::select(DB::raw("YOUR QUERY AS IT IS"));
С Query Builder — Вы можете попробовать что-то вроде этого..
DB::query()->fromSub(function($main_query){
$main_query->from('users')
->select(
DB::raw('distinct s.id as state_id, s.name as state_name, u.id as user_id,
case when uga.id is null then 1 else 0 end as inactifs,
case when uga.id is null then 0 else 1 end as actifs
')
)
->join('states as s', 'u.state_id', '=', 's.id')
->leftJoin('user_group_affiliations as uga', 'uga.user_id', '=', 'u.id')
->where('uga.active', 1)
->where(function($query){
return $query->whereNull('uga.start_date')
->orWhere('uga.start_date' '<=' date_create())
})
->where(function($query){
return $query->whereNull('uga.end_date')
->orWhere('uga.end_date' '>=' date_create())
})->groupBy('u.state_id') }, "quer")->get();
Дайте мне знать, если это поможет..
Комментарии:
1. Хотя это возможно, это обходит множество полезных функций Laravel. Обычно лучше правильно перенести код для использования Eloquent (или Fluent, если это не связано с реальными моделями), если это вообще возможно.
2.@Gopal Panadi спасибо, приятель! получилось
0 => {#957 ▼ "state_id": "1" "state_name": "تونس 1" "inactifs": "3188" "actifs": "45" "total": "3233" } 1 => {#964 ▼ "state_id": "2" "state_name": "تونس 2" "inactifs": "1365" "actifs": "32" "total": "1397" } ...
3. Нет проблем @LaadhariAmine . Все еще есть -1: D
4. Предлагая использовать
DB::raw
, вы также должны подчеркнуть риск внедрения SQL и поощрять использование привязок при использовании любого пользовательского ввода в запросе. Имейте в виду, что некоторые начинающие программисты, которые наткнутся на ваш ответ, не будут обращать внимания на любые риски, которым они подвергают себя, когда вы предлагаете такой короткий ответ.