Конструктор запросов Laravel - использование данных в строке для сравнения со временем в другом - PullRequest
0 голосов
/ 17 апреля 2019

Я получил эту работу с использованием whereRaw, как показано ниже:

Reports::whereRaw('last_check_datetime < CURRENT_TIMESTAMP - INTERVAL `check_schedule_minutes` MINUTE')->get();

В таблице есть несколько отчетов с разными минутами расписания.т.е. я хочу, чтобы один отчет проверялся каждые 15 минут, а другой - каждые 60 минут.Если время в last_check_datetime не превышает количество минут в check_schedule_minutes, то отчет не должен возвращаться в коллекции.

Есть ли способ добиться того же, используя более синтаксический синтаксис Eloquentв идеале с карбоном?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Tbh Я думаю, что вы делаете здесь правильно.Проблема в вашем вопросе - вы хотите объединить синтаксис PHP / MySQL, но данные находятся в MySQL.Итак, без предварительной выборки всех записей, а затем проверки, то, что вы сделали, правильно, и на самом деле этого нельзя избежать.Однако, если вы действительно хотите более красноречивое решение для построения, здесь:

Reports::where('last_check_datetime', '<', DB::raw('CURRENT_TIMESTAMP - INTERVAL `check_schedule_minutes` MINUTE'))->get();

Tbh, хотя, я думаю, где whereRaw аккуратнее.

0 голосов
/ 17 апреля 2019

Вы можете использовать метод eloquent whereBetween для столбцов даты

Reports::whereBetween('last_check_datetime', [Carbon::now()->subMinutes($check_schedule_minutes), Carbon::now()])->get();

Должно помочь тебе.

РЕДАКТИРОВАТЬ: я понимаю, что это зависит от того, что вы знаете значение $check_schedule_minutes до выполнения запроса, когда ваш вопрос читает check_schedule_minutes из таблицы. Одним из способов решения этой проблемы было бы иметь предопределенный стандарт для check_schedule_minutes (как вы сказали, через 15 или 60 минут), затем передать это значение в функцию, выполняющую запрос, и добавить это к вашим условиям:

$check_schedule_minutes = 60;

Reports::whereBetween('last_check_datetime', [Carbon::now()->subMinutes($check_schedule_minutes), Carbon::now()])
->where('check_schedule_minutes', $check_schedule_minutes)
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...