За последние 24 часа нас посетили 22718 программистов и 1281 робот. Сейчас ищут 868 программистов ...

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

Тема в разделе "Laravel", создана пользователем xintrea, 7 май 2019.

  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Имею 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-х часов от текущего момента.

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

    Код (Text):
    1.  
    2. $result=Article::where('is_use', false)->where('created_at', '<', '(NOW() - INTERVAL 2 HOUR)')->get();
    3.    
    4. info("Garbage collector for Article is run: ".$result." count ".count($result));
    В результате записи не находятся:

    Код (Text):
    1.  
    2. Garbage collector for Article is run: [] count 0
    Хотя такие записи однозначно есть.

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

    Код (Text):
    1.  
    2. {"query":"select * from `articles` where `is_use` = ? and `created_at` < ?","bindings":[false,"(NOW() - INTERVAL 2 HOUR)"],"time":0.95}
    И по-ходу дела запрос получается такой:

    Код (Text):
    1.  
    2. select * from `articles` where `is_use` = false and `created_at` < "(NOW() - INTERVAL 2 HOUR)";
    То есть, имеются кавычки вокруг выражения времени, и оно воспринимается как строка. Если кавычки убрать, то запрос нормально выполняется.

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

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Документацию читать никто не хочет... DB::raw()
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @xintrea
    Вот прям конкретно для этого - whereRaw. Но посмотри все примеры raw.

    Чтобы код на PHP был с красивой подсветкой, оформляй его в ббкоды [php] ... [/php]
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А если с часовыми поясами не напортачено, то
    PHP:
    1. where('created_at', '<', now()->subHours(2))