如何在yii2中创建表单后使用更新?

时间:2017-03-17 00:46:38

标签: php sql yii2

我有_form

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'result')->textInput(['maxlength' => true]) ?>
    <?= $form->field($model, 'test1')->textInput(['maxlength' => true]) ?>
    <?= $form->field($model, 'test2')->textInput(['maxlength' => true]) ?>
<?php ActiveForm::end(); ?>

<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

我需要设置一个公式: result = test1 * test2

使用原始sql我可以把它放在控制器中:

public function actionIndex(){
     Yii::$app->db->createCommand("UPDATE table1 SET result = test1*test2")->execute();
etc...
}

没关系。但我认为这不正确。所以最好的方法是:

       public function actionTest($id)
       {
            $model = $this->findModel($id);
            $model->result = $model->test1 * model->test2 
       }

后:

<?= Html::a('gotest', ['test', 'id' => $model->id], ['class' => 'btn btn-success']) ?>

但是如何从表单创建到actionIndex获取$model->id?或者其他选择?

1 个答案:

答案 0 :(得分:1)

我认为在Yii2中执行此操作的一种干净方法应该是使用afterFind回调来使用您的计算值填充result字段,如下所示:

模型

public function afterFind()
{
    $this->result = $this->test1 * $this->test2;
}

您在afterFind中放入的所有逻辑都将在Yii2从DB获取结果后立即执行。当你需要在放入表单或DataProvider之前计算某些东西时,这很好,因为一切都会在模型中发生。

如果我做对了,你甚至不需要数据库中的结果字段。 (通过这种方式,只需在模型中声明它,创建一个如下虚拟字段:public $result;,您就可以像使用表格一样使用它。