Взаимодействие со связующей таблицей в yii2?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
wchch
Сообщения: 1
Зарегистрирован: 2019.05.04, 16:19

Взаимодействие со связующей таблицей в yii2?

Сообщение wchch »

Объясните, пожалуйста, на примерах, как должен выглядеть код, который выполняет следующую задачу:
Допустим, у нас есть 3 таблицы в бд: фильмы, жанры, таблица для связи фильмов и жанров. Необходимо в формах update/create фильма сделать ToggleButtonGroup, который в create отображает все существующие жанры, а в update - все существующие, и отмечает выбранными те, которые найдены в бд в связующей таблице. И, соответственно, адекватно обновляет их в бд при изменении выбора.

Сейчас вручную сохраняю связи, разбирая url и проходясь циклом. Но, наверное, можно было и проще.

Код: Выделить всё

$genre_array = Yii::$app->request->post('movies')['moviesgenres'];
        foreach ($genre_array as $genre)
        {
            $movie_genre = new MovieGenreRel();
            $movie_genre -> genre = $genre;
            $movie_genre -> movie = $model -> id;
            $movie_genre -> save(true);
        }
Не пойму, как написать адекватный код для update. Сдаётся мне, в yii должны быть какие-то стандартные средства, которые чуть ли не в 3 строчки справятся с этой задачей.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Взаимодействие со связующей таблицей в yii2?

Сообщение futbolim »

Таких волшебных средств нет. Сохраняйте сами.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Взаимодействие со связующей таблицей в yii2?

Сообщение yan »

Максимум что из имеющегося функционала можете извлечь - создать релейшен между genre и movie с ->via(MovieGenreRel::class)
в результате в цикле, если получить все $genre в виде моделей, м.б. будет писать красиво $genre->link('relation', $movie) и удалять через unlink или unlinkAll

Массовое изменение связанных данных в активрекорде возможно только через расширения типа SaveRelationBehavior.

Но вообще возможно лучше в подобном случае не парится с активрекордом, а просто через DAO массово удалять связи и массово вставлять через batchInsert()
Последний раз редактировалось yan 2019.05.18, 17:32, всего редактировалось 1 раз.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Взаимодействие со связующей таблицей в yii2?

Сообщение futbolim »

Как вариант тут есть пример метода afterSave()
viewtopic.php?f=19&t=45472
Ответить