Нужна ли очередная ORM — Query-Builder?

Новогодние каникулы. Самое время написать что-нибудь полезное. Но идей много, а не все могут быть хорошими. Поэтому хочу с вами посоветоваться.

Многие популярные 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-ах, которыми вы пользуетесь?
  • Вопрос задан
  • 3758 просмотров
Пригласить эксперта
Ответы на вопрос 7
@gro
Вам нужна очередная ORM с таким синтаксисом?
Если нужна - сделайте и никого не спрашивайте.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ваш вариант мне нравится меньше нежели реализация QueryBuilder в Doctrine2. А еще там есть DQL, тоже иногда удобно. Да и меня в нем лично все устраивает.
Ответ написан
Вообще, да. Если вам удобно – делайте, не спрашивая, а единомышленники всегда найдутся, идея-то хорошая. Мне такой подход очень даже нравится. Будем ждать :-)
Ответ написан
мне не нравится текущий подход в phpшных orm. и очень нравится как в джанго.
пытаюсь сделать что-то похожее https://github.com/buldezir/dja_orm
зацените, если не сложно, фидбэк лучше в скайп ( buldezir )
Ответ написан
Комментировать
@xAockd
Использую Eloquent (Laravel). Очень просто, лаконично, удобно. Так же работал с doctrine2, но Eloquent'a вполне хватает для большинства моих задач.
Ответ написан
sanchezzzhak
@sanchezzzhak
Ля ля ля...
а мне не понравилось напоминает стиль коханы for_table бээ.
Тогда лучше просто table
В laravel Eloquent'a вполне себе удобная ORM
Единственное напрягает, когда не стандартный SQL надо впихнуть делать нужно через DB::raw
Ответ написан
Ну как, есть движение по ORM? :-)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы