Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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('Y-m-d');

->where('date', '<', $dayAfter)

Примечания:

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

Ответ 2

Считаете ли вы использование:

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

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

UPDATE

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

Ответ 3

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

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

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

whereDate('date',$date)

Ответ 4

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

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

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

Ответ 5

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

Я использую

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

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

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

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

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

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