@NetyNicka

Как правильно подружить forignKey и создание записи в yii2?

Доброго времени суток товарищи!
Имеется таблица машин (car[car_id,....,car_options_id]), есть таблица опций для каждой машины (car_options[car_options_id,....])
В миграции прописано создание ключа
$this->addForeignKey('FK_car_options', 'car', 'car_options_id', 'car_options', 'car_options_id', 'RESTRICT', 'RESTRICT');

В модели указано правило
[['car_user_id', 'car_options_id'], 'required'],
Следовательно, при создании машины необходимо указывать уже существующий id опций, что временно переросло в:
public function actionCreate()
    {
        $carModel = new Car();
        $carOptionsModel = new CarOptions();
        //ставится временный id 
        $carOptionsModel->car_options_id = 1;
        if (
            $carModel->load(Yii::$app->request->post()) && $carOptionsModel->load(Yii::$app->request->post())
        ) {
            if ($carModel->validate() && $carOptionsModel->validate()) {
                //Обнуляется при сохранении
                $carOptionsModel->car_options_id = null;
                $carOptionsModel->save();
                $carModel->car_options_id = $carOptionsModel->car_options_id;
                $carModel->save();
            }
            return $this->redirect(['view', 'id' => $carModel->car_id]);
        } else {
            return $this->render('create', [
                'model' => $carModel,
                'carOptions' => $carOptionsModel
            ]);
        }
    }

Но что-то подсказывает, что это не самое верное решение, и должен быть более правильный вариант. Как правильно поступить в этой ситуации?
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
igorbelikov
@igorbelikov
Fullstack Developer
Если я правильно понял вашу структуру таблиц, то вы кажется допустили ошибку в проектировании бд.
У вас должно быть по идее примерно так:
cars - car_id, name
options - option_id, name
cars_has_options - id, car_id, option_id, value

При такой структоре значение по умолчанию указывать не нужно будет.
И далее вы устанавливаете релейшены и будете получать список опций примерно так: $car->options
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы