3

我想通过方法更新插入的原始字段afterSave,所以我在驱动程序模型中开发以下代码

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))));
        }
}

并在 Controller 中使用 crud 制作的方法:

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

4 回答 4

5

你的 updateByPk 搞砸了..

检查文档

由于不清楚你想做什么..所以我假设你想通过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 即使在创建新记录后也为真,但在第一次之后,它总是为假..

来自 Yii 论坛 由强自己说..

于 2012-08-29T15:53:01.177 回答
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()

于 2012-08-30T06:24:44.237 回答
0

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

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

于 2013-01-31T10:22:37.403 回答
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();
        }
于 2016-07-21T05:30:51.023 回答