Laravel Eloquent учитывает несколько диапазонов данных

#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');