Yii uuid 模型保存为主键返回 null
Posted
技术标签:
【中文标题】Yii uuid 模型保存为主键返回 null【英文标题】:Yii uuid model save returning null for primary key 【发布时间】:2014-02-27 21:20:19 【问题描述】:我能够将数据保存到数据库中,它会在主键列 (id) 中创建一个 uuid。当我调用 $model->save();然后访问 $model->id,它返回:
"expression":"UUID()","params":[]
它应该返回数据库中的实际值...如何获取mysql存储的实际值?
我有一个在 uuid 中添加的 beforeSave 函数:
public function beforeSave()
if ($this->isNewRecord)
$this->id = new CDbExpression('UUID()');
return parent::beforeSave();
我还尝试创建一个触发器,在更新 id 之前执行 mysql uuid 函数...然后 $model->id 返回 null。
【问题讨论】:
Id 是您数据库中的主键吗? @RafayZiaMir 是的 id 是主键 你能解释一下 $this->id=new CDbExpression('UUID()');这条线在做什么?您是否将 id 设置为 CDbExpression 的实例? 这似乎是相关的:github.com/yiisoft/yii/issues/406 @RafayZiaMir 我将 id 设置为 mysql 函数 uuid。我正在使用 CDbExpression,因为它允许执行 mysql 函数,否则它会尝试将其作为文本插入 【参考方案1】:问题是你告诉 Yii 运行一个 MySQL 函数来插入数据库。它这样做很好,但 Yii 之后不会重新读取记录来获取值。重新阅读它会效率低下,因为你正在做的事情不是很常用,而且通常不需要从数据库中读取。您可以通过 2 种方式解决此问题:
1) 自己从数据库中读取值。你可以做一个 $model->save(); $模型->刷新();之后,您应该在 $model 中拥有新数据
2) 你可以让你的函数做一个
public function beforeSave()
if ($this->isNewRecord)
$this->id = Yii::app()->db->createCommand('select UUID()')->queryScalar();
return parent::beforeSave();
我没有对此进行测试,但你明白了。
这将进入数据库,运行 UUID() 并将结果返回给 yii。通过为 $this->id 分配一个字符串而不是 mysql 命令,您将能够立即使用该值而无需进行刷新。这仍然会使用 MySQL 来获取 UUID,所以它仍然会给服务器带来一些压力。
通常我会做类似的事情
public function beforeSave()
if ($this->isNewRecord)
$this->hash = hash('ripemd160',microtime());
return parent::beforeSave();
所以我根本不使用 MySQL 服务器,但是因为您使用列作为 ID,您可能希望 UUID() 生成真正唯一的 ID。
【讨论】:
非常好的答案。尝试了很多东西,我认为选项 2 就是我想要的。 我编辑了答案,抱歉我从未尝试过,我忘记了我需要做一个选择:)。很高兴你有它的工作。以上是关于Yii uuid 模型保存为主键返回 null的主要内容,如果未能解决你的问题,请参考以下文章