我想通过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;
}
答案 0 :(得分: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即使在创建新记录后也是如此,但在第一次之后 时间,总是假的..
答案 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();
}