2017-05-07 86 views
1

我有一个简单的模型只有2个参数 - '总和'和'名称'。我创建了这个模型的类的一个新对象,并将它发送到一个视图。鉴于我有两个领域 - 也是'总和'和'名字'。 当我在字段中输入值(fe sum = 10,name = Joe)时,我期望我的当前总和将减少10,但对于用户Joe,它将增加10.(数据库中还有三列 - 'id', 'sum'和'name')。 但我不能从该字段传输此名称来更新数据库。如何使用活动记录字段创建类的对象?

//Controller 
public function actionSum() 
{ 
    $model = new SumForm(); 
    if ($model->load(Yii::$app->request->post())) { 
     if ($user = $model->sumfunction()) { 
     } return $this->goHome(); 
    } 
    return $this->render('sum', [ 
     'model' => $model, 
    ]); 
} 

//Model 
class SumForm extends Model 
{ 
public $sum; 
public $name; 


public function attributeLabels() 
{ 
    return [ 
     'sum' => 'Sum', 
     'name' => 'Name', 
    ]; 
} 

public function sumfunction() 
{ 
    if ($this->validate()) { 
     $desc = User::findOne(Yii::$app->user->getId()); 
     $desc->sum -= $this->sum; 
     $desc->save(); 
     $inc = User::findOne(['name'=>Yii::$app->request->post('name')]); 
     //here I need to take a row for user which name I input 
     $inc->sum += $this->sum; 
     $inc->save(); 
    } 
} 

//in view 'sum' only two fields and button 

回答

0

当您使用ActiveRecord时,您将获取附加到模型的参数。在这种情况下,SumForm [名]使用它

最好的办法:

$inc = User::findOne(['name' => $this->name]); 
    $inc->sum += $this->sum; 
    $inc->save(false); //without validation! Fix it later. 

,并添加SumForm:

public function rules() 
{ 
    return [ 
     [['name'], 'string'], 
     [['sum'], 'safe'], 
    ]; 
} 

,并显示您的用户模型。还必须有属性名称和总和的验证器。

和actionSum()的变化:

// if ($model->load(Yii::$app->request->post())) { 
if ($model->load(\Yii::$app->request->post()) && $model->validate()) { 

如果模型验证失败,你会看到在形式的错误。

形式:

<?php $form = ActiveForm::begin(); ?> 

<?= $form->field($model, 'name')->textInput() ?> 
<?= $form->field($model, 'sum')->textInput() ?> 

<?= Html::submitButton('confirm') ?> 
<?php ActiveForm::end(); ?> 
+0

谢谢您的回复!但是在这种情况下没有db的更新。 – Jens

+0

对不起,更新了答案... – onmotion

+0

感谢onmotion的帮助。一切都很好。只需要发布($ this-> username)而不是post('username')。 – Jens