Запрос с использованием красноречивого whereMonth, где дата является строкой

В одной из таблиц столбец с типом 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.

Есть ли способ привести строковое значение к дате перед его запросом, возможно, с использованием необработанных выражений? Если да, любые подсказки были бы замечательными.

где('booking_date', 'LIKE', '%'.$someDate.'%') может работать

robbyrr 18.07.2019 01:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
1 998
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете легко добиться этого благодаря библиотеке 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 по мутаторам даты

Другие вопросы по теме