При переходе на 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 веб сайтов и мобильных приложений.
Почему спрашиваю:
Я в публикации своего кода - новичок, поэтому потрачу много времени на это. Хочется сформировать понимание, что этот инструмент будет полезен.