#laravel #eloquent
#laravel #eloquent
Вопрос:
Я пытаюсь выяснить, как создать запрос Laravel, который выдаст мне следующий запрос mysql.
select
count(CASE WHEN points BETWEEN 0 AND 1.99 THEN 1 END) as count0_199,
count(CASE WHEN points BETWEEN 2 AND 3.99 THEN 1 END) as count2_399,
count(CASE WHEN points BETWEEN 4 AND 5.99 THEN 1 END) as count4_599
from
stats
Возможно ли сделать это в Eloquent? Не видел этого в документации.
Спасибо
Комментарии:
1. Вы надеялись достичь этого с помощью одного запроса eloquent?
Ответ №1:
Насколько мне известно, использование eloquent для выполнения этого потребует некоторого форматирования возвращаемых данных:
$results = [];
$stats = Stat::where('points', '>=', '0')
->where('points', '<=', 5.99)
->get()
->each(function ($stat, $key) use (amp;$results) {
if ($stat->points >= 0 amp;amp; $stat->points <= 1.99) {
$results['count0_199'][] = $stat;
}
if ($stat->points >= 2 amp;amp; $stat->points <= 3.99) {
$results['count2_399'][] = $stat;
}
if ($stat->points >= 4 amp;amp; $stat->points <= 5.99) {
$results['count4_599'][] = $stat;
}
});
return $results;
В приведенном выше коде возвращаются все статистические данные, в которых точки находятся между 0
и 5.99
(поскольку они будут возвращены в любом случае). Затем возвращенная коллекция проходит цикл для заполнения $results
массива, который сгруппирует возвращенные данные.
Существует также DB
фасад:
$query = [
'count(CASE WHEN points BETWEEN 0 AND 1.99 THEN 1 END) as count0_199',
'count(CASE WHEN points BETWEEN 2 AND 3.99 THEN 1 END) as count2_399',
'count(CASE WHEN points BETWEEN 4 AND 5.99 THEN 1 END) as count4_599'
];
$results = DB::select(implode(',', $query) . ' from stats');