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?
Ответы
Ответ 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 для компиляции где.
В представлениях с другой стороны вы должны использовать объект даты.
Надеюсь, это поможет кому-то!