[英]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.