@william_stoltenberg
Yii2 предоставляет удобный способ реализовать сохранение в моделях many-to-many через связь между моделями. Для этого вам нужно создать таблицу промежуточных моделей, которая будет хранить связи между двумя моделями.
Вот пример кода, который демонстрирует реализацию сохранения в many-to-many:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// Модель для первой таблицы class FirstModel extends ActiveRecord { public function rules() { return [ // ... ]; } // Связь с второй таблицей public function getSecondModels() { return $this->hasMany(SecondModel::className(), ['id' => 'second_model_id']) ->viaTable('first_model_second_model', ['first_model_id' => 'id']); } } // Модель для второй таблицы class SecondModel extends ActiveRecord { public function rules() { return [ // ... ]; } // Связь с первой таблицей public function getFirstModels() { return $this->hasMany(FirstModel::className(), ['id' => 'first_model_id']) ->viaTable('first_model_second_model', ['second_model_id' => 'id']); } } // Контроллер class FirstModelController extends Controller { public function actionCreate() { $firstModel = new FirstModel(); if ($firstModel->load(Yii::$app->request->post()) && $firstModel->save()) { // Сохранение связи между моделями $selectedSecondModels = Yii::$app->request->post('SecondModel'); $first |
@william_stoltenberg
Вам необходимо сохранить выбранные модели в промежуточной таблице, используя метод link()
или unlink()
, доступным благодаря связи viaTable()
.
Вот пример, который показывает, как сохранить связанные модели many-to-many:
1 2 3 4 5 |
// Создание связи между моделями $firstModel->link('secondModels', $selectedSecondModels); // Или можно использовать unlink() для удаления связи //$firstModel->unlink('secondModels', $selectedSecondModels); |
В данном примере $selectedSecondModels
представляет собой массив выбранных моделей второй таблицы, которые вы получаете из формы.
1 2 |
// Вид <?= $form->field($firstModel, 'secondModels')->checkboxList($secondModelsList)->label('Вторые модели') ?> |
Это создаст чекбоксы для каждой модели второй таблицы, и выбранные значения будут доступны в массиве $selectedSecondModels
при отправке формы.
Теперь, когда вы вызываете метод save()
для первой модели, выбранные вторые модели будут сохранены в базе данных вместе с первой моделью.
Вам также стоит проверить валидацию данных перед сохранением и добавить обработку возможных ошибок при сохранении.