简单的afterSave方法在Yii中不起作用

时间:2012-08-29 11:13:39

标签: php mysql activerecord yii

我想通过afterSave方法更新插入的raw中的字段,因此我在Driver Model中开发了以下代码

protected function afterSave() {
        parent::afterSave();
        if ($this->isNewRecord) {
            $newid = self::newid($this->id);
            $this->updateByPk($this->id, new CDbCriteria(array('condition'=>'driverid = :driverid', 'params'=>array('driverid'=>  $newid))));
        }
}

并且在控制器中使用的方法:

public function actionCreate()
{
    $model=new Driver;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Driver']))
    {
        $model->attributes=$_POST['Driver'];
        if($model->save())
            $this->redirect(array('view','id'=>$model->id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

保存后为什么不起作用?

编辑:

    private static function CheckNumber($number) {
        $array = array(10);
        for ($i = 0; $i < 10; $i++)
            $array[$i] = 0;
        do {
            $array[$number % 10]++;
            $number /= 10;
        } while ((int) ($number / 10 ) != 0);
        $array[$number]++;

        for ($i = 0; $i < 10; $i++)
            if ($array[$i] > 1)
                return false;
        return true;
    }

public static function newid($id) {
    while (self::CheckNumber($id) == FALSE) {
        $id++;
    }
    return $id;
}

4 个答案:

答案 0 :(得分:5)

你的updateByPk搞砸了..

Check Documentation

由于不清楚你想要做什么。所以我假设你想用刚刚插入的行的self::newid($this->id);的结果更新driver_id值..

你应该做的是:

protected function afterSave() {
    parent::afterSave();
    if ($this->isNewRecord) {
        $newid = self::newid($this->id);
        $this->driverid = $new_id;
        $this->isNewRecord = false;
        $this->saveAttributes(array('driverid'));
    }
}

是的,你对afterSave()

的使用是正确的
  

isNewRecord即使在创建新记录后也是如此,但在第一次之后   时间,总是假的..

From Yii Forum said By Qiang Himself..

答案 1 :(得分:1)

正如Rajat正确指出的那样,你的updateByPk();是不正确的。您可以改为使用此行来更新新创建的记录的driverid字段:

$this->updateByPk($this->id,array('driverid'=>$newid));

所以你的整个afterSave()变成了这个:

protected function afterSave() {
    parent::afterSave();
    if ($this->isNewRecord) {
        $newid = self::newid($this->id);
        $this->updateByPk($this->id,array('driverid'=>$newid));
    }
}

saveAttributes()最终会调用updateByPk()

答案 2 :(得分:0)

如果插入成功完成,“CActiveRecord”中的insert方法将“isNewRecord”属性设置为“false”。

因此,afterSave方法中的“if($ this-&gt; isNewRecord)”条件始终为false,程序将永远不会在此条件下执行updateByPk方法。这就是为什么你的afterSave不起作用的原因。

答案 3 :(得分:0)

public function afterSave(){
        if($this->isNewRecord) {
            $transaction_entry = new TransactionEntry;
            $transaction_entry->branch_id = 1;
            $transaction_entry->date_of_transaction = $this->bill_date;
            $transaction_entry->account_category_id = 1;
            $transaction_entry->description = $this->student->admission_no ."-".$this->course->course_name."-".$this->fee_month."/".$this->fee_year;
            $transaction_entry->amount = $this->total_amount;
            $transaction_entry->save();
        }