Laravel Eloquent сравнивает дату с поля datetime

Я хочу получить все строки из таблицы через выражение:

table.date <= 2014-07-10 

Но если столбец содержит дату и время, скажем:

 2014-07-10 12:00:00 

Но если я это сделаю:

 where('date', '<=', $date) 

он не получит строку.

Я предполагаю, что это потому, что $ date = 2014-07-10, что делает MySQL предполагать, что это 2014-07-10 00:00:00.

В обычной MySQL я бы просто сделал

 where DATE(date) <= $date 

Что было бы эквивалентом, используя Larvel's Eloquent?

Laravel 4+ предлагает вам следующие методы: whereDay() , whereMonth() , whereYear() ( # 3946 ) и whereDate() ( # 6879 ).

Они выполняют SQL DATE() для вас и управляют различиями SQLite.

Ваш результат может быть достигнут следующим образом:

 ->whereDate('date', '<=', '2014-07-10') 

Дополнительные примеры см. В первом сообщении № 3946 и этой статье Laravel Daily .

Обновление: Хотя вышеупомянутый метод удобен, как отмечено Arth, он неэффективен для больших наборов данных, потому что функция DATE() SQL должна применяться к каждой записи, тем самым отбрасывая возможный индекс.

Значения, сравниваемые как строки, вот некоторые способы сделать сравнение (но, пожалуйста, прочитайте примечания ниже):

 ->where('date', '<=', '2014-07-10 23:59:59') ->where('date', '<', '2014-07-11') // '2014-07-11' $dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Ym-d'); ->where('date', '<', $dayAfter) 

Заметки:

  • 23:59:59 в порядке (на данный момент) из-за 1-секундной точности, но посмотрите на эту статью: 23:59:59 – это не конец дня. Нет, действительно!
  • Имейте в виду случай «нулевой даты» («0000-00-00 00:00:00»). Хотя этих «нулевых дат» следует избегать, они являются источником многих проблем. Лучше сделайте поле нулевым, если необходимо.

Рассматривали ли вы использование:

 where('date', '<', '2014-08-10') 

Вам следует избегать использования функции DATE() для индексированных столбцов в MySQL, поскольку это мешает движку использовать индекс.

ОБНОВИТЬ

Поскольку, как представляется, есть некоторые разногласия относительно важности DATE() и индексов, я создал скрипку, которая демонстрирует разницу, см. POSSIBLE KEYS .

Вы можете получить всю запись о дате «2016-07-14», используя ее

  whereDate('date','=','2016-07-14') 

Или используйте другой код для динамической даты

 whereDate('date',$date) 

Вы можете использовать это

 whereDate('date', '=', $date) 

Если вы дадите whereDate, то сравните только дату из поля datetime.

Если вам все еще интересно, как это решить.

я использую

$protected $dates = ['created_at','updated_at','aired'];

В моей модели и в моем, где я делаю

where('aired','>=',time())

Так что просто используйте unix для compaire где.

В других случаях вы должны использовать объект даты.

Надеюсь, это поможет кому-то!