LINUX.ORG.RU

Выборка записей по времени в Laravel - не работает

 , , , ,


0

1

Имею SQL-базу MariaDB Ver 15.1 Distrib 10.1.37-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2.

Есть таблица с полями:

- is_use (тип boolean)
- created_at (стандартное поле timestamp)

Пытаюсь найти в таблице записи, у которых поле is_use=false и время создания более 2-х часов от текущего момента.

Делаю такой запрос:

$result=Article::where('is_use', false)->where('created_at', '<', '(NOW() - INTERVAL 2 HOUR)')->get();
            
info("Garbage collector for Article is run: ".$result." count ".count($result));


В результате записи не находятся:

Garbage collector for Article is run: [] count 0


Хотя такие записи однозначно есть.

Информация о сконструированном SQL-запросе следующая:

{"query":"select * from `articles` where `is_use` = ? and `created_at` < ?","bindings":[false,"(NOW() - INTERVAL 2 HOUR)"],"time":0.95}


И по-ходу дела запрос получается такой:

select * from `articles` where `is_use` = false and `created_at` < "(NOW() - INTERVAL 2 HOUR)";


То есть, имеются кавычки вокруг выражения времени, и оно воспринимается как строка. Если кавычки убрать, то запрос нормально выполняется.

Но как заставить Eloquent конструировать запрос с выражением времени так, чтобы это выражение не помещалось в кавычки?

★★★★★

Ответ на: комментарий от goingUp

->whereDate( 'created_at', '<', Carbon::now()->subHours(2) )->
Вполне приличное решение

Оказывается, этот код делает не то что я хотел.

whereDate() - это именно сравнение дат, время при сравнении отбрасывается. Чтобы сравнить время, нужен код:

->where( 'created_at', '<', Carbon::now()->subHours(2) )->

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Понапридумывали говно-обёрток. А ведь гораздо проще было запрос написать текстом используя плейсхолдеры (mysqli/PDO) и не ссать за иньекции. Тем более, врядли ты когда-либо слезешь с машки на какойнить посгрес.

deep-purple ★★★★★ ()