Про магию AR и Laravel
В Laravel, как и во многих фреймворках в качестве слоя модели используется паттерн ActiveRecord. Не так давно я наткнулся на небольшую магию Eloquent и запросами на выборку с условиями.
Стандартный код для выборки с условием в Laravel выглядит примерно так:
User::where('login', '=', 'kotchuprik')->firstOrFail();
В Eloquent есть магический __call(), который обрабатывает методы начинающиеся на “where”, например:
User::whereLogin('kotchuprik')->firstOrFail();
Запрос к БД будет такой же, как и в коде выше, где where расписан более развернуто, но код выглядит компактней. Таким образом, __call() добавляет возможность шорт синтаксиса where.
В целом довольно приятно, но у меня использование такой магии создало проблему.
User::whereFirstName('Костя')->firstOrFail();
В сгенерированном SQL-запросе будет выборка с условием по полю first_name. В моем случае, в этом и будет загвоздка, потому что у меня у полей в таблицах camelCase именование (ага, именно так, в БД camelCase).
Для изменения принудительного snake_case в where, при использовании шорт синтаксиса, достаточно сделать две вещи:
- Сделать свой класс Builder с наследованием от \Illuminate\Database\Query\Builder, в котором будет перекрыт метод addDynamic() с вызовом camel_case(), вместо snake_case().
- В базовом классе модели перекрыть метод newBaseQueryBuilder(), в котором будет возвращаться наш новый Builder.
В заключение, хочу напомнить про laravel-ide-helper. Это генератор кода, который научит IDE понимать фасады. Он же умеет генерировать phpdoc для моделей на основе метаданных таблиц в БД, а также добавляет @method phpdoc для шорт синтаксиса where.