繁体   English   中英

如何将自动增量主键附加到同一个表中的另一个字段?

[英]How do i append an auto increment primary key to another field in the same table?

我正在为mysql使用yii活动记录 ,并且我有一个表,其中有一个字段需要附加同一个表的主键。 主键是自动增量字段,因此在保存之前我无法访问主键。

$model->append_field = "xyz".$model->id; // nothing is appending
$model->save();
$model->append_field = "xyz".$model->id; //id is now available

我该怎么做呢?
我知道我可以在插入后立即更新,但有更好的方法吗?

执行INSERT语句后,只会为您的记录分配一个id 有没有办法确定是什么id是插入之前,所以必须与你的INSERT后级联字段的值来执行更新。

您可以在MySQL中编写存储过程或触发器来为您执行此操作,因此您的应用程序执行单个SQL语句来完成此操作。 但是,您只是将逻辑移到MySQL中,最后发生了INSERT和UPDATE。

一些更多的解决方法:

这几乎是你的方法;)

$model->save();
$model->append_field = "xyz".$model->id; //id is now available
$model->save();

但是您可以将此功能移动到使用自定义afterSave()方法的行为 ,请注意您必须注意不循环事件。

或者只是为它写一个吸气剂

function getFull_append_field(){
  return $this->append_field.$this->id;  
}

但是你不能在SQL语句中使用它,除非你用CONCAT()或类似的东西在那里创建属性。

任何其他人来到这个问题可能会对我如何实现它感兴趣,所以这里是代码:

//in the model class
 class SomeModel extends CActiveRecord{
  ...
  protected function afterSave(){
     parent::afterSave();
     if($this->getIsNewRecord()){
        $this->append_field=$this->append_field.$this->id;
        $this->updateByPk($this->id, array('append_field'=>$this->append_field));
     }
  }
 }

避免循环事件的一种方法(如@schmunk所述)是在afterSave()方法中使用saveAttributes(...) ,但saveAttributes(...)检查isNewRecord ,并仅在它是一个值时插入一个值新记录,所以要求我们使用setNewRecord(false); 在调用saveAttributes(...)之前。
我发现saveAttributes(...)实际上调用了updateByPk(...)所以我直接使用了updateByPk(...)本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM