我有_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
?或者其他选择?
答案 0 :(得分:1)
我认为在Yii2中执行此操作的一种干净方法应该是使用afterFind
回调来使用您的计算值填充result
字段,如下所示:
在模型:
中public function afterFind()
{
$this->result = $this->test1 * $this->test2;
}
您在afterFind
中放入的所有逻辑都将在Yii2从DB获取结果后立即执行。当你需要在放入表单或DataProvider之前计算某些东西时,这很好,因为一切都会在模型中发生。
如果我做对了,你甚至不需要数据库中的结果字段。 (通过这种方式,只需在模型中声明它,创建一个如下虚拟字段:public $result;
,您就可以像使用表格一样使用它。