One-To-One Updater
loveorigami opened this issue · 8 comments
Увидел новое поведение Linker. Также заметил отдельные классы Updater.
Предлагаю добавить OneToOneUpdater
для случая, когда одна запись хранится в 2 таблицах.
Классический пример - User (id, login, password) и Profile('name', 'avatar', 'site', 'bio') и т.д.
Тогда ваше поведение будет полностью соответствовать новому названию ))) !
Так, а в чем проблема сохранять связь one to one?
Это самый простой тип связи и для него не нужно никаких инструментов.
ПС. В чем смысл хранить профиль юзера отдельно от модели юзера?
Это я для примера навскидку...
Тогда пример из практики - у меня есть 3 сайта.
1 главный, на котором работают менеджеры. 2 других используют базу первого.
Каждый день общие таблицы (цены, настройки санатория, отеля) выгружаются по крону на 2 других.
Вместе с тем, чтоб сайты были разные - текста, описания, комментарии для каждого из них свои собственные.
Поэтому у меня таблица разбита на 2 части
object_config
- то, что можно выгружать (статус, ведущий менеджер, контактные данные, прайс ....)
object_content
- то, что уникально для данного сайта (описание, seo-параметры. галерея и тп...)
Для удобства CRUD операций я их разнес на standalone actions
https://github.com/loveorigami/lo-core/blob/master/actions/crud/Update.php
И все контроллеры у меня имеют вид
https://github.com/loveorigami/lo-module-main/blob/master/modules/admin/controllers/IncludeItemController.php
Поэтому не хочется заводить дополнительные action-ы, писать транзакции, в моем случае + доп. проверки на права пользователя, когда нужно сохранить простую связь...
Поэтому и предлагаю переложить эту операцию на поведение.
Нечто похожее можно глянуть тут
https://github.com/notamedia/yii2-relation#one-to-one
Нужно подумать над этим. Если есть желание, мешь реализовать OneToOne
апдейтер и я включу его в пакет.
Но на практике лучше делать так:
- Данный с сайта приходят на экшен
- Экшен заполняет форму
- Форма валидирует данные
- Если все Ок, то форка заполняе AR модель
- Модели сохраняются и выдают true\false
Вот как раз в том месте где заполняются модели и можно делать связь
onetoone, так как как это всего лишь заполнение одого атрибута с модели А
значением со второго атрбута у модели B.
Для этого у меня реализован yii2-crud-toolkit который делает все то же
самое, что и твоя система, только с кучей других фич и бОльшей гибкостью)
У тебя ведь формы на сайте построены на а AR моделях?
У меня это делает MetaModel - https://github.com/loveorigami/lo-core/blob/master/db/MetaFields.php
Которая отвечает за всевозможные настройки аттрибутов -
https://github.com/loveorigami/lo-module-love/blob/master/models/AphorismMeta.php
и как они будут выводится в фильтре, в форме (с каким виджетом), с какими правилами валидации и тп...
например
// атрибут
"aut_id" => [
"definition" => [
"class" => \lo\core\db\fields\AjaxOneField::class, // берет данные через ajax
"inputClassOptions" => [
'loadUrl' => ['author/list'], // select в форме
],
'gridOptions'=>[
'loadUrl' => ['author/list'], // фильтр в гриде - тоже через ajax
],
"title" => Yii::t('backend', 'Author'),
"showInGrid" => true, // показывать в гриде
"showInExtendedFilter" => false, //расширенный фильтр
"isRequired" => false, // валидация
"tab" => 'content', // в какой вкладке выводить (для больших форм)
],
"params" => [$this->owner, "aut_id", "aut"] // aut = getAut() - это relation
],
- Action для селекта - https://github.com/loveorigami/lo-core/blob/master/actions/crud/ListId.php
- Тип атрибута - https://github.com/loveorigami/lo-core/blob/master/db/fields/AjaxOneField.php
и очень много других параметров....
Итого - все что я меняю для нового модуля - это только модель со связями и metaModel с настройками, Все остальное - генерируется (копируется)
На примере все того же модуля Page
https://github.com/loveorigami/lo-module-page
Вид у которой - https://github.com/loveorigami/lo-module-page/blob/master/modules/admin/views/item/_form.php
Для сохранения many-to many я прописываю атрибут, который объявил в вашем поведении и все... В форме он выведится или как список чекбоксов, или как Select2, все будет зависеть от объявленного класса...
Вот чтоб не использовать на каждый случай связи тот или иной вид поведения, и для практичности захотелось иметь все в одном комплекте...
Я даже с примерами не смог понять идею, которая реализуется в твоем коде.
Ну, оно может и к лучшему=)
В общем, мне как не крути, не хватит личного времени, чтобы сделать еще и
OneToOne апдейтер.
Сейчас я активно рефакторю поведение, так как нашел ошибку в логике.
У тебя есть реальный интерес и время\возможность создать его, написать
тесты и отправить pull request?
Логику, будет время - напишу. На днях буду решать эту задачу. Если у меня заработает - PR пришлю, конечно же
А тесты - не смогу, т.к. их ни разу еще не писал.
Ну так надо научиться) Как раз есть реальная задача на которой можно
потренироваться.
Да и база для тестов уже есть в репо, надо просто по примеру дополнить.
Без тестов нельзя выкатывать релиз.
ок, я посмотрю. спасибо за наводку )