2017-03-17 5 views
1

Ich habe ein _form:Wie benutze ich das Update nach dem Erstellungsformular in yii2?

<?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']) ?> 

ich eine Formel festlegen müssen:

Mit rohen SQL result = test1 * test2 kann ich es in der Steuerung setzen:

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

Und Es ist in Ordnung. Aber ich denke, es ist nicht korrekt. So ist die beste Art und Weise, dies zu tun ist:

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

nach:

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

Aber wie kann ich $model->id von Formular erstellen, um actionIndex bekommen? Oder vielleicht andere Option?

Antwort

1

Ich denke, eine saubere Art und Weise dies in Yii2 zu tun soll afterFind Rückruf verwenden, um Ihr result Feld mit Ihrem berechneten Wert zu füllen, wie folgt aus:

In Ihrem Modell:

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

All Logik, die Sie in Ihre afterFind setzen, wird ausgeführt, kurz nachdem Yii2 das Ergebnis von DB erhalten. Es ist schön, wenn Sie etwas vor dem Einfügen in ein Formular oder einen DataProvider berechnen müssen, da alles direkt im Modell passiert.

Wenn ich das richtig verstanden habe, brauchen Sie nicht einmal das Ergebnisfeld in Ihrer Datenbank. (Auf diese Weise deklarieren Sie es einfach in Ihrem Modell, erstellen Sie ein virtuelles Feld wie dieses: public $result; und Sie können es genauso verwenden, als ob es in der Tabelle existiert.

+1

In diesem Fall brauche ich das Ergebnis in der Datenbank. Und 'afterFind()' funktioniert sehr gut, ich habe es vor einer Minute getestet. Und um ein virtuelles Feld mit 'public $ result;' hinzuzufügen, sehr interessant, denke ich, dass es für eine andere Aufgabe benötigt wird ex. 'checkboxList()' und Einfügen in eine Datenbankzelle (mit 'implode') .So wird Ihre Antwort mein Verständnis über die Verwendung des Modells verbessern. Vielen Dank –

Verwandte Themen