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