@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() для первой модели, выбранные вторые модели будут сохранены в базе данных вместе с первой моделью.
Вам также стоит проверить валидацию данных перед сохранением и добавить обработку возможных ошибок при сохранении.