Про магию AR и Laravel

Constantine Chuprik
1 min readSep 5, 2014

--

В 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, при использовании шорт синтаксиса, достаточно сделать две вещи:

  1. Сделать свой класс Builder с наследованием от \Illuminate\Database\Query\Builder, в котором будет перекрыт метод addDynamic() с вызовом camel_case(), вместо snake_case().
  2. В базовом классе модели перекрыть метод newBaseQueryBuilder(), в котором будет возвращаться наш новый Builder.
https://gist.github.com/kotchuprik/9f035bb33bf4d33ec9bf.js

В заключение, хочу напомнить про laravel-ide-helper. Это генератор кода, который научит IDE понимать фасады. Он же умеет генерировать phpdoc для моделей на основе метаданных таблиц в БД, а также добавляет @method phpdoc для шорт синтаксиса where.

--

--