Страница 1 из 1

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

Добавлено: 2019.05.17, 13:30
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 строчки справятся с этой задачей.

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

Добавлено: 2019.05.17, 18:41
futbolim
Таких волшебных средств нет. Сохраняйте сами.

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

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

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

Но вообще возможно лучше в подобном случае не парится с активрекордом, а просто через DAO массово удалять связи и массово вставлять через batchInsert()

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

Добавлено: 2019.05.18, 00:20
futbolim
Как вариант тут есть пример метода afterSave()
viewtopic.php?f=19&t=45472