Новогодние каникулы. Самое время написать что-нибудь полезное. Но идей много, а не все могут быть хорошими. Поэтому хочу с вами посоветоваться.
Многие популярные ORM почему-то имеют синтаксис по сути дела sql-запросов, только в php-выражениях, как например:
$females = ORM::for_table('person')->where('gender', 'female')->find_many();
Люди, которые не пользуются ORM, используют PDO-конструкции, которые достаточно топорные и имеют свойство повторяться в одном и том же виде постоянно.
Что хотелось бы? Более изящных внутренне-благородных вещей. Но легких и простых для понимания.
1. Хочется красивых нативных OOP-style селектов:
Например, чтобы выбрать пользователей старше 30 лет и вывести их на страницу, я хотел бы видеть что-то вроде:
foreach ($db->users->age->gt(30) as $user) {
echo $user->title;
}
2. Простой вызов подсчета найденных строк - count, isEmpty методы
Есть ли пользователи старше 28 лет?
$db->users->age(28)->isEmpty();
3. Красивые нативные Join’s
Очень часто синтаксис для join-ов в ORM такой, что по сути это и есть sql-запрос, только в вызовах php-методов. Хотелось бы видеть это более в изящном виде:
$db->users
->extend($db->roles->id->title->userId($db->users->id))
->find();
4. Прозрачное приведение типов после выполнения запросов:
$db->users
->id->toInt()
->title->toString()
->find();
5. Пакетная мульти-вставка строк
По какой то причине, очень часто в ORM пропускают такую приятную вещь и все пишут очередной костыль с массивами и генерацией строки insert на ее основе.
$db->users
->new()->title('John')
->new()->title('Jack')
->new()->title('Smith')
->save();
6. Условные условия
Как бы это ужасно не звучало, в приложениях встречается один и тот же код: если есть какой то параметр, то добавить его в запрос и в bind-переменные. Хотелось бы видеть это в таком виде:
$db->users
->name('john')
->if($age)->age($age)
->find();
7. Прозрачный camelCase
В mysql таблицы и поля называются через подчеркивание, в PHP часто используется camel-case. Библиотека могла бы прозрачно преобразовывать эти два формата написания:
$db->users->fullName(‘Jack Jones’);
8. Однострочники
Если нужно вывести на страницу имя текущего пользователя, это могло бы выглядеть так:
$db->users($id)->title
Что вы думаете по этому поводу? Все ли вас устраивает в ORM и query-builer-ах, которыми вы пользуетесь?