仅在创建新记录时修改SQL列

时间:2013-10-20 16:55:06

标签: activerecord yii

seq是数据库表中的整数列。

我想要一个CActiveRecord派生类,它会在创建新记录时在SQL中执行seq=MAX(seq)+1,并且在更新现有记录时不会修改seq列。

如何?

1 个答案:

答案 0 :(得分:0)

由于整个业务逻辑尚不清楚,但从上面的讨论中,这可能是您的解决方案:

将以下两个函数添加到所需的模型类中,您就完成了!

public function beforeSave(){
 if($this->isNewRecord){
   $this->seq=$this->getNextSeq();
  }

  return parent::beforeSave();
}

public function getNextSeq(){
  $maxSeq = $this->findBySql('select max(seq)+1 as seq from ' . $this->tableName(), array());
  return (!$maxSeq->seq ? 1 : $maxSeq->seq); 
}

只是旁注

如果您使用的是mysql,则可以优化最后一个函数(当表为空时),例如

 public function getNextSeq(){
      $maxSeq = $this->findBySql('select coalesce(max(seq),0)+1 as seq from ' . $this->tableName(), array());
      return $maxSeq->seq; 
    }

我不确定其他DBMS是否支持coalesce功能。