Вопрос сообществу: нужно ли ещё одно расширение для работы с данными?
Добавлено: 2017.07.14, 10:28
Приветствую.
При переходе на Yii2 меня не устроила новая концепция ActiveRecord, поэтому было принято решение написать свой инструмент для работы с данными.
Пример:
Результат выборки: массив 10 пользователей из организации "Рога и копыта", зарегистрированные в 2017 году, с завершёнными заказами, отсортированными по сумме заказа, со списком товаров.
При сохранении - изменится название организации, но не сумма заказа, поскольку на это нет прав #actions.
Как работает выборка данных:
Реализуется жадная загрузка;
Методами ActiveQuery формируется один SQL запрос;
Связанные таблицы выбираются с помощью LEFT JOIN;
#where связанных таблиц добавляется к условию ON;
#limit реализуется с помощью подзапроса во FROM, работает именно так, как он и должен работать (однако, применим только к коревой таблице);
После выполнения запроса строятся деревья данных алгоритмом линейной сложности.
В Represent реализованы интерфейсы выборки, сохранения и удаления (в том числе связанных данных).
Реализован контроллер, реализующий REST интерфейс доступа.
Общий принцип работы следующий: создаются классы наследуемые от Represent, в них описываются правила выборки и модификации данных и через единый контроллер получаем доступ к репрезентам.
На данный момент инструмент применяется для REST API у SPA веб сайтов и мобильных приложений.
Почему спрашиваю:
Я в публикации своего кода - новичок, поэтому потрачу много времени на это. Хочется сформировать понимание, что этот инструмент будет полезен.
При переходе на Yii2 меня не устроила новая концепция ActiveRecord, поэтому было принято решение написать свой инструмент для работы с данными.
Пример:
Код: Выделить всё
$userRepresent = new Represent(app/models/User);
$userRepresent->query([
"#actions" => "crud",
"#where" => ["org.name" => "Рога и копыта"],
"#whereStr" => "t.registration_date > '2017.01.01' ",
"#limit" => 10,
"#offset" => 10,
"fname",
"lname",
"registration_date",
"org" => [
"#actions" => "crud",
"name",
"orgData" => [
"value",
"orgDataType" => ["name"]
]
],
"orders" => [
"#where" => ["orders.status.name" => "Завершён"],
"#order" => "orders.sum DESC",
"number",
"sum",
"orderStatus" => [
"name"
],
"items" => [
"name",
"price",
"currency" => ["name_short"]
]
]
]);
$users = $userRepresent->all();
$users[0]['org']['name'] = "Новые рога и копыта";
$users[0]['orders'][0]['sum'] = 1000;
$userRepresent->saveOne($users[0]);
При сохранении - изменится название организации, но не сумма заказа, поскольку на это нет прав #actions.
Как работает выборка данных:
Реализуется жадная загрузка;
Методами ActiveQuery формируется один SQL запрос;
Связанные таблицы выбираются с помощью LEFT JOIN;
#where связанных таблиц добавляется к условию ON;
#limit реализуется с помощью подзапроса во FROM, работает именно так, как он и должен работать (однако, применим только к коревой таблице);
После выполнения запроса строятся деревья данных алгоритмом линейной сложности.
В Represent реализованы интерфейсы выборки, сохранения и удаления (в том числе связанных данных).
Реализован контроллер, реализующий REST интерфейс доступа.
Общий принцип работы следующий: создаются классы наследуемые от Represent, в них описываются правила выборки и модификации данных и через единый контроллер получаем доступ к репрезентам.
На данный момент инструмент применяется для REST API у SPA веб сайтов и мобильных приложений.
Почему спрашиваю:
Я в публикации своего кода - новичок, поэтому потрачу много времени на это. Хочется сформировать понимание, что этот инструмент будет полезен.