voskobovich/yii2-many-to-many-behavior

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
апдейтер и я включу его в пакет.
Но на практике лучше делать так:

  1. Данный с сайта приходят на экшен
  2. Экшен заполняет форму
  3. Форма валидирует данные
  4. Если все Ок, то форка заполняе AR модель
  5. Модели сохраняются и выдают 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 
            ],

и очень много других параметров....

Итого - все что я меняю для нового модуля - это только модель со связями и 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 пришлю, конечно же
А тесты - не смогу, т.к. их ни разу еще не писал.

Ну так надо научиться) Как раз есть реальная задача на которой можно
потренироваться.
Да и база для тестов уже есть в репо, надо просто по примеру дополнить.
Без тестов нельзя выкатывать релиз.

ок, я посмотрю. спасибо за наводку )