@slip31

Как сохранить id в модель?

Есть две связанные модели - в одной только id есть, соответственно правила валидации пустые
public function rules()
    {
        return
         [];
    }

Вторая содержит имя, которое я связываю с id предыдущей модели
Если создать CRUD первой модели, то он генерит форму с вставкой ID
form->field($model, 'id')->textInput()
При этом, при нажатии на кнопку "сохранить", всё ок - генерится и записывается в базу id.
Но заносить, конечно, мне его не хочется. Однако если я удаляю это поле, то модель не сохраняет ID, хотя должна (ну мне так кажется) делать это автоматом. Все var_dump($model->gerErrors()) ничего не выводят.

Форма с закоментированным id:
<?php // $form->field($model, 'id')->textInput() ?>    
    <?= $form->field($modelLang, 'direction_name')->textInput() ?>

Controller
$model = new Direction();
        $modelLang = new DirectionLang();

        if ($model->load(Yii::$app->request->post()) &&
                $modelLang->load(Yii::$app->request->post()) && $model->save()) {
            $modelLang->lang_id = 2;
            $modelLang->direction_id = $model->id;
            $modelLang->save();
            var_dump($model->getErrors());
            var_dump($modelLang->getErrors());

            return $this->redirect(['view', 'id' => $model->id]);
        }

Как получать id модели Direction не вводя его в поле?
Он всё таки 'id' => $this->primaryKey(),

P.S. Пока решил так
<?php echo $form->field($model, 'id')->hiddenInput()->label(false); ?>
, но, наверное, есть другой путь какой то
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
Естественно у Вас не будет сохранять потому, что Вы не загружаете модель из POST, её там просто нет. Для этого Вам и потребовался скрытый input, что бы можно было загрузить необходимую модель через $model->load(). Поэтому со скрытым input всё работает.
Если Вы уберёте из кода загрузку модели, в которой только один id, то всё сработает.
Например, модель с единственным атрибутом id у Вас Direction. Значит в действии надо сделать так
$model = new Direction();
$modelLang = new DirectionLang();

if ($modelLang->load(Yii::$app->request->post()) && $model->save()) {
     $modelLang->lang_id = 2;
     $modelLang->direction_id = $model->id;
     $modelLang->save();
      var_dump($model->getErrors());
      var_dump($modelLang->getErrors());

     return $this->redirect(['view', 'id' => $model->id]);
}

В этом случае всё сработает и можно удалить скрытый input из формы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@grinat
Другого пути нет, чтобы узнать какую модель сохранять, надо знаю ее id. Либо запихнуть вангу в сервер, и она будет определять какую запись соизволил чел отредактировать)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы