Запрос Laravel получает строку на основе 2 зависимых столбцов

#mysql #laravel #eloquent #laravel-query-builder

Вопрос:

Помогите мне задать этот вопрос. У меня есть приложение Laravel, в котором есть таблица с 3 столбцами (квартал, год, значение).

quartal год ценность
1 2019 3
2 2019 5
3 2019 5
4 2019 10
1 2020 7
2 2020 5

Например, я хочу получить значение от 3-го квартала 2019 года до 2-го квартала 2020 года. Как сделать запрос для этого случая? в течение года я могу использовать промежуток, но для четверти это зависит от года.

вот мой текущий запрос. но это не очень хорошо работает

 DB::table($table)
->whereBetween('year',[$startYear, $endYear])
->whereBetween('quartal',[$startQuartal, $endQuartal])
->get();
 

Ответ №1:

Что вам нужно сделать, так это создать составной столбец из quartal year и затем запросить его.

 DB::table($table)
->whereRaw("concat(year,quartal) >= ?", "$startYear$startQuartal")
->whereRaw("concat(year,quartal) <= ?", "$endYear$endQuartal")
->get();
 

Вы можете сослаться на это для SQL-запроса https://www.db-fiddle.com/f/4GRH5RKqQi2Fc6wVvxK8C2/0

Комментарии:

1. это отлично работает для меня. но все же немного отредактируйте его ‘»concat(год, квартал)>=$StartYear$startQuartal»‘, не знаю, почему иногда он дает данные меньше, чем должен, если у него есть «?». Спасибо Вам за решение

2. Это не очень хорошая идея, вы будете уязвимы для SQL-инъекций. Я бы рекомендовал использовать отладку toSsql() и getBindings() посмотреть, что на самом деле происходит с запросом.

Ответ №2:

вы также можете сделать это с помощью функции фильтра, и это простой способ, как

 $startYear = 2019
$endyear = 2020
$startQuartar = 3
$endQuartar = 2
DB::table($table)
->whereBetween('year',[$startYear, $endYear])
->get()->filter(function($query) use 
($startYear,$endYear,$startQuartar,$endQuartar){
    if($query->year == $startYear and $query->quartar < $startQuartar){
       return false;
    }
    if($query->year == $endYear and $query->quartar > $endQuartar){
      return false;
    }
      return true;
});
 

Ответ №3:

Как насчет добавления четверти к году?

 DB::table($table)
    ->whereBetween(
        DB::raw('year   (quartal - 1) / 4'),
        [
            $startYear   ($startQuartal - 1) / 4,
            $endYear   ($endQuartal - 1) / 4
        ]
    )
    ->get();