Вопрос сообществу: нужно ли ещё одно расширение для работы с данными?

Выкладываем свои наработки
Ответить

Стоит публиковать?

да
3
100%
нет
0
Голосов нет
 
Всего голосов: 3

vitaliy_pashkov
Сообщения: 6
Зарегистрирован: 2014.02.03, 07:37

Вопрос сообществу: нужно ли ещё одно расширение для работы с данными?

Сообщение vitaliy_pashkov » 2017.07.14, 10:28

Приветствую.

При переходе на 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]);
Результат выборки: массив 10 пользователей из организации "Рога и копыта", зарегистрированные в 2017 году, с завершёнными заказами, отсортированными по сумме заказа, со списком товаров.
При сохранении - изменится название организации, но не сумма заказа, поскольку на это нет прав #actions.

Как работает выборка данных:
Реализуется жадная загрузка;
Методами ActiveQuery формируется один SQL запрос;
Связанные таблицы выбираются с помощью LEFT JOIN;
#where связанных таблиц добавляется к условию ON;
#limit реализуется с помощью подзапроса во FROM, работает именно так, как он и должен работать (однако, применим только к коревой таблице);
После выполнения запроса строятся деревья данных алгоритмом линейной сложности.

В Represent реализованы интерфейсы выборки, сохранения и удаления (в том числе связанных данных).
Реализован контроллер, реализующий REST интерфейс доступа.
Общий принцип работы следующий: создаются классы наследуемые от Represent, в них описываются правила выборки и модификации данных и через единый контроллер получаем доступ к репрезентам.

На данный момент инструмент применяется для REST API у SPA веб сайтов и мобильных приложений.

Почему спрашиваю:
Я в публикации своего кода - новичок, поэтому потрачу много времени на это. Хочется сформировать понимание, что этот инструмент будет полезен.

zelenin
Сообщения: 10101
Зарегистрирован: 2013.04.20, 11:30

Re: Вопрос сообществу: нужно ли ещё одно расширение для работы с данными?

Сообщение zelenin » 2017.07.14, 11:19

Вы опишите, чем новая концепция AR отличается от старой, чтобы понять, что вас не устроило. Затем расскажите какие проблемы решает ваше расширение, кроме замены квери билдера на конфигурацию массивом. Потом проголосуем. Пока непонятно о чем это вообще.

vitaliy_pashkov
Сообщения: 6
Зарегистрирован: 2014.02.03, 07:37

Re: Вопрос сообществу: нужно ли ещё одно расширение для работы с данными?

Сообщение vitaliy_pashkov » 2017.07.14, 13:10

Чем новая концепция AR отличается от старой:
В общем - усложнением семантики билдера. Например, чтобы детализировать JOIN необходимо создать функцию, изменяющую подзапрос.

Какие проблемы решает расширение:
1. Описание запроса в декларативном стиле.
Понимаю, что это сугубо субъективный подход. Лично мне, этот подход кажется в разы более простым, по сравнению с билдером AR.

2. Сохранение связанных данных по изменённому дереву.
3. Удаление связанных данных. Как родительских так и дочерних.
4. Корректный LIMIT со связанными данными.
5. Корректный COUNT при запросах с условиями ограничивающими количество по связанным данным.



Ответить