В одной из таблиц столбец с типом varchar содержит дату следующего формата day-month-year. Я хотел бы выполнить запрос, используя красноречивый для этой таблицы с whereYear и whereMonth, но я получаю сообщение об ошибке, так как столбец booking_date не имеет типа Date.
Запрос, который я пытаюсь запустить,
MyTable::whereYear('booking_date', '=', $year)
->whereMonth('booking_date', '=', $month)
->get();
И получаю следующую ошибку
"SQLSTATE[42883]: Undefined function: 7 ERROR: function pg_catalog.date_part(unknown, character varying) does not exist\nLINE 1: ...\" = $1 and \"said_table\".\"deleted_at\" is null) and extract(ye...\n ^\nHINT: No function matches the given name and argument types. You might need to add explicit type casts.
Есть ли способ привести строковое значение к дате перед его запросом, возможно, с использованием необработанных выражений? Если да, любые подсказки были бы замечательными.






Вы можете легко добиться этого благодаря библиотеке Carbon, которая включена в Laravel:
use Carbon\Carbon;
$targetDate = Carbon::now()->year($year)->month($month);
MyTable::whereYear('booking_date', '=', $targetDate)
->whereMonth('booking_date', '=', $targetDate)
->get();
Если это поле все время будет датой для конкретной модели (и с таким именем, как «booking_date», вполне может быть), это даже проще, чем иметь дело с ним при каждом запросе. Вы можете указать его в поле дат на самой модели:
protected $dates = [
'booking_date',
];
По умолчанию Eloquent преобразует столбцы created_at и updated_at в экземпляры Carbon, и вышеописанное сделает то же самое для booking_date. Дальнейшее литье не требуется. Из Документация Laravel по мутаторам даты
где('booking_date', 'LIKE', '%'.$someDate.'%') может работать