如何在Yii2中为相关模型的插入和更新操作创建表单?

时间:2018-09-02 08:17:03

标签: yii2 insert relation

我有两个模型:SSp。在Sp模型中,与hasOne()S关系。

SpController中,我有两个动作,insertupdate,如下所示:

public function actionCreate()
{
    $model = new Sp();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('update', [
        'model' => $model,
    ]);
}

sp/views/_form.php中,我有一个与S相关的字段,如下所示:

<?= $form->field($model->s, 'name')->textInput(['maxlength' => true]) ?>

由于存在关系,它在更新操作中可以正常工作,但是会在创建操作中在s上引发<?= $form->field($model->s, 'name')->textInput(['maxlength' => true]) ?>不存在的错误。

如何在create action中绑定name字段?

2 个答案:

答案 0 :(得分:1)

如果要以这种方式使用关系模型,则需要手动创建模型。不要忘记实际保存来自S模型的数据。

public function actionCreate() {
    $model = new Sp();
    $model->populateRelation('s', new S());

    if (
        $model->load(Yii::$app->request->post()) && $model->validate()
        && $model->s->load(Yii::$app->request->post()) && $model->s->validate()
    ) {
        $model->s->save();
        $model->s_id = $model->s->id;
        $model->save();
        return $this->redirect(['view', 'id' => $model->id]);
    }

    return $this->render('create', [
        'model' => $model,
    ]);
}

但是您应该真正考虑创建专用的表单模型,而不是直接使用Active Record。它将使视图和控制器更加简单。

答案 1 :(得分:1)

我认为实现目标的正确方法是创建一个具有所有所需属性(在本例中为S对象的“名称”)的FormModel,并在视图中使用它,例如:

$form->field($formModel, 'sName')->textInput(['maxlength' => true]) ?>