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

そしてコントローラーでは、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 は、新しいレコードが作成された後も true ですが、初回以降は常に false になります。

Yii フォーラムから、Qiang 自身が言った..

于 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」の挿入メソッドは「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 に答える