voskobovich/yii2-linker-behavior

дополнительное поле в промежуточную таблицу

Closed this issue · 4 comments

Здравствуйте. Написал сначала на форуме- попросили написать вам лично.
http://yiiframework.ru/forum/viewtopic.php?f=19&t=42879
Там же в форуме модель и таблицы описаны.

-------копия верхнего текста с форума----------------------------------
Можно ли добавлять дополнительное поле в промежуточную таблицу используя это поведение ? Что нужно прописать в Геттерах - зеттерах?
Поясню зачем .
1-я таблица это фильмы. У одного фильма может быть несколько режиссеров. Например Иванов АА, Борисов Б и Петров В , взятых из таблицы media_man.
А так же у одного фильма может быть несколько продюсеров . Тот же Иванов А.А и Петров. Они тоже взяты из таблицы media_man. Т.е в промежуточную таблицу нужен еще параметр- тип человека.

Есть вариант- сделать на каждый человека тип промежуточную таблицу- но это очень плохой вариант. Наиболее хороший- это добавить к промежуточной таблице(media_has_man) тройной ключ и поле c типом человека. Но я не уверен, что данное поведение обладает данным функционалом.
Замечу. Без дополнительного поля- поведение работает.

Вот вы написали вопросы в целых два источника, ждали ответа на форуме, ждали ответа от меня. Хотя начать надо было начать с прочтения документации вот здесь.

Спасибо, что хоть не обозвали. 1). У вас неполнота документации. Если повторишь по инструкции- не получишь результата. ( вот тут похожая тема расписана немного , но намного качественнее http://fancode.ru/post/yii2-behaviors-many-to-many). Новичёк точно не получит результата. Поэтому документация не внушает доверия. Укажу почему. а) надо указать пример таблиц б) как с этими таблицами работать в каждом варианте связей 2). Документация на английском- а разработчики и пользователи русские. 3) И самое важное- когда закрываешь в форуме тему, то правилом хорошего тона указать, каким способом я это решил. Так вот, я должен по идее указать вот этот issiues гитхаба. Но наверное придется тему закрыть , из-за того что проблема не решена.

Предисловие

К вашему сожалению я не ставил себе цели создать обучающий материал для новичков. Целью было максимально описать функционал поведения с примерами, чтобы человек прочитавший пару статей о структурах связей БД и пробовавший написать свой велосипед для обслуживания связей, хотя бы, раза 3 смог понять о чем разговор.

То, что документация не внушает доверия это странно. Она есть, она содержит все, что должно помогать разработчикам решать свои задачи. Доверять или нет - дело каждого.
На крайняк есть исходники. Они уж точно не будут врать :)

На счет ваших замечаний:

  1. Если вы просите структуру таблицы, смею предположить, что вы не знаете как построить связь много ко многим. Как вы собрались пользоваться готовым решением?
    Для построения связи много-ко-многим одна структура. Пожалуйста, нажмите сюда. И, пожалуйста, прочтите теоретические знания на хабре.

  2. Как видно – каждого варианта связей своя структура. Как с ними работать описано в офф доке Yii2. Это базовые знания, без которых вы не сможете работать с поведением. Оно так и останется черным ящиком.

  3. Незнание английского... вы уж простите, в наше время это не отговорка. Как минимум по двум причинам:

    1. Это де-факто обязательно (хотя бы уметь читать документацию);
    2. Есть бесплатный средства перевода.

    То есть получить перевод документации сегодня – не проблема.

  4. Вы правильно делаете, что придерживаетесь правил хорошего тона. Так вот, перед созданием темы\вопроса стоит прочесть документацию. Как я понял - вы этого не сделали и это очень плохо. Не делайте так больше.

Если после изучения теории о связях в реляционных БД, после изучения документации Yii2, после изучения документации к поведению и, наконец, после изучения исходников у вас не получилось реализовать задуманное - вы имеете полное право открыть issue. Ну, это в идеальном варианте.

Ни в коем случае не хотел вас обидеть, совсем наоборот. Я выделил время, чтобы написать полный ответ на вопрос, чтобы было максимально понятно :)

На счет вашего вопроса

Мне не приходилось реализовывать такой логики, как требуется у вас.
Но вот у человека была похожая ситуация и он допилил функцию в поведении.
То есть, вы можете описать две связи в поведении и настроить у них условие выборки и значение для поля type_key, как показано в примере. Таким образом при создании записей через связи, поле тип будет заполняться само, а при получении через связь будут возвращаться только записи с этим типом.

Сразу скажу, после рефакторинга поведения эта функция не покрывалась тестами. Так что она работает с вероятностью 90%. Если протестируете ее и будут баги, напишите мне – исправим.

Благодарю за развернутый ответ. По сути могли бы только последний абзац написать.

По поводу велосипедов- уже один есть. Но он слишком кривой и не гибкий.

По поводу связи many-many и пункта 1. Я согласен , что в идеале структура промежуточной таблицы должна быть как вы описали. Но вот если бы вы работали с virtualmart ... например с табличкой virtuemart_product_categories , вы бы были несколько удивлены. Там есть автоинкремент с id , а также отдельно связующие поля к которым выставлен уникальный ключ. Ну или с bitrix, где всё в настраиваемых полях хранится ( с битриском возможно я не прав- сейчас работаю над подобной проблемой).
2, 3- согласен , но приходится работать по принципу 20-80. Иначе никак.

Итог длинной дискуссии. Нужно допиливать. Буду исправлять более лаконичный вариант- который сам нашёл.
Еще раз спасибо за ответ.