Велосипед «ORM» для автоматизации. Следует ли продолжать и в каком направлении? Интересно ли?

Создан класс для работы с pdo (для внутренних нужд).

Имеется следующее:
Абстрактный класс для создания моделей
SQL билдер запросов
Мини-кеширование повторяющихся запросов в пределах коннекта (включая проверку на измененные данные).

Abstract Methods:
where():
where() - array

[
"user" => "10",
["%and", "status/!=|number" => "rhfghdfgh$%^456456"],
[["type" => "admin"], ["%or", "type" => "advert"], ['%or', ["st" => 2], ["%or", "st" => 3]]],
['%and',"date/>=" => "//now()//"]

Result:

user = :user and status <> :status and (type = :type or type = :type1 or (st = :st or st = :st2)) and date >= now() or status = :status3

data:

( [user] => 10 [status] => 456456 [type] => admin [type1] => advert [st] => 2 [st2] => 3 [status3] => 1 )

Из многомерного массава с бесконечном количеством вложений создает читаемый шаблон для pdo (включая расстановку скобок, обработку свободных запросов типа "now()" и фильтрацию данных) и массив со списком ключей и значений для этого шаблона.

selectBy() - array

Example:

selectBy(array("count(*)","id"))

Result:

select count(*), id

Позволяет выгружать определенные значения из базы

+ группировка результатов для удобной выгрузки и работы с несколькими таблицами одновременно

selectBy(array("count(*) as count<-user","id<-user"))

Result:
Array (

[0] => stdClass Object
    (
        [user] => stdClass Object
            (
                [count] => 10
                [id] => 17
            )
     )

)


orderBy() - array
Сортировка
Example:

orderBy(array("date"=>"asc"))

Result:

Iшаблон + order by date asc

limit() - array

Example:

limit(array("1"=>"100"))

Result:

LIMIT 1,100

data() - array

(for add and update methods)

Example:

data(array("id"=>"100","status"=>"2"))

Result:

id='100', status='2'

find() - Find data

Model::selectBy("COUNT(id)")->where(array("id"=>2))->find();

Model::selectBy("COUNT(id)")->find(array("id"=>2));

update() - Update data

Model::data(array("status"=>2))->where(array("id"=>2))->update();

Model::where(array("id"=>2))->update(array("status"=>2));

delete() - Delete data

Model::where(array("id"=>2))->dalete();

add() - Add data

Model::data(array("status"=>2,"name"=>"name"))->add();

Model::add(array("status"=>2,"name"=>"name"));

Builder environment "where": [[[],[[],[[],[...]]]]]

Levels of investments are divided brackets "()"

Attachment may contain:

array("%and/%or","key"=>"val")

Key may contain:

"key/rule|filter"

Example:

"id/>=|number"=>"1dfsg0456hfgh##$%"

For many tables:

"table->column/rule|filter"

Result:

id >= "10456"

Filters:

noSpec, noHtml, charNumber, char, number

Rules:

=, !=, >=, <=, >, <, like, in, not in

Про группировки подробнее:

$table = CollectTables::selectBy(

["users.login<-user","userGroups.name as groupName<-group","userGroups.permissions<-group"]

)->

table(["users", "userGroups"])->

find(

array("users->group" => "//userGroups.id//","users->id/<"=>1)

);

print_r($table->rows);

Result:
Array (

[0] => stdClass Object

    (

        [user] => stdClass Object

            (

                [login] => Demo User

            )

        [group] => stdClass Object

            (

                [groupName] => VIP

                [permissions] => {"createFlow":"1"}

            )

    )

)


1 - Полезно ли это будет хоть кому-то кроме меня?
2 - В каком направлении двигаться и в чем косяки такого способа работы с базой?
3 - Интересно ли это вам и нужно ли это публиковать для всех?
4 - Хочет ли кто-то помочь развить эту библиотеку и протестировать для себя?
  • Вопрос задан
  • 383 просмотра
Пригласить эксперта
Ответы на вопрос 3
Denormalization
@Denormalization
Какой-то мозгодробильный синтаксис у where/select/order. Что за наследие брейнфака?
Я бы побоялся такое использовать. Лишняя скобочка не там, и гг.
Ответ написан
Комментировать
trevoga_su
@trevoga_su
1 - Полезно ли это будет хоть кому-то кроме меня?
нет, но для тебя это может стать вполне приемлемым инструментом, если отточишь до блеска.

2 - В каком направлении двигаться и в чем косяки такого способа работы с базой?
твой косяк в том, что ты пишешь сам не понимая чего и называешь это все очень громкими именами, такими как ORM
при этом ты все смешал в кучу и я не вижу тут никакой ORM
я вижу попытку написать 1001 никому не нужный билдер запросов

ORM должна работать на основе паттернов, таких как ActiveRecord или DataMapper, получать объекты моделей, а не просто stdClass и транслировать эти объекты обратно в базу:

data-mapper.gif

вот эти все дрочи
Model::data(array("status"=>2))->where(array("id"=>2))->update();
они никому не нужны. потому что реальные запросы гораздо более сложны, чем выборка по одному условию where. есть запросы, которые просто невозможно уложить в билдеры. ты же делаешь акцент на билдеры, а должен делать на ORM. Вот тебе пример data mapper класса. для его работоспособности используется простой билдер, но сложный sql пишется руками. и практически всегда возвращаются не просто объекты, а объекты моделей, ассоциируемые с этим data mapper. Обрати внимание, что почти в каждом методе вызываются
return parent::result2objects(...);
return parent::findModelListByParams($params);
return parent::findModelByParams($params);


т.е. ORM всегда отдает реальные доменные объекты, а не просто stdClass.
Ответ написан
Комментировать
dmitriylanets
@dmitriylanets
веб-разработчик
Ваш ответ на вопрос

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

Похожие вопросы