Как запросить дату раньше (месяц и год) только? (Laravel) - PullRequest
0 голосов
/ 28 октября 2019

У меня есть этот фильтр, чтобы позволить пользователю фильтровать по месяцам и годам.
$ month = $ request ['month'];
$ year = $ request ['year'];

Вот то, что я пытаюсь получить все данные до даты и года из таблицы. например: получить все данные до марта 2019 года.
$result = DB::table('a')->select(*)->whereMonth('date','<=',$month)->whereYear('date','<=',$year)->get();

, но приведенный выше запрос дает мне результат только за январь и февраль за каждый год до 2019 года вместо каждого месяца до марта 2019 года

1 Ответ

0 голосов
/ 28 октября 2019

Просто используйте прямое сравнение с литералом даты:

$result = DB::table('a')
    ->select(*)
    ->where('date', '<', '2019-03-01')
    ->get();

Это соответствует следующему необработанному запросу MySQL:

SELECT *
FROM a
WHERE date < '2019-03-01';

Обратите внимание, что вышеприведенное предложение WHERE равно sargable , что означает, что можно использовать индекс, включающий столбец date. Следующая версия, которую вы предлагаете, не предназначена для sargable:

SELECT *
FROM a
WHERE
    YEAR(date) < 2019 OR (YEAR(date) = 2019 AND MONTH(date) < 3);

Вот код Laravel для этого:

$result = DB::table('a')
    ->select(*)
    ->whereYear('date', '<', '2019')
    ->orWhere(function($query) {
        $query->whereYear('date', '=', '2019')
               ->whereMonth('date', '<', '3')
    })
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...