我有两个模型:S
,Sp
。在Sp
模型中,与hasOne()
有S
关系。
在SpController
中,我有两个动作,insert
和update
,如下所示:
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
字段?
答案 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]) ?>