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的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 - 在模型中提交时如何从小部件中获取数据?

未保存的关联模型类一直返回 null

Laravel 类型提示,模型保存时 id 返回 null

Yii2 UUID 未与模型值映射

Yii 一些小的问题

在 afterSave Yii 中使用 foreach 将动态值保存到另一个表/模型