Yii uuid模型保存为主键返回null

时间:2014-02-27 21:20:20

标签: php mysql yii

我能够将数据保存到数据库,并在主键列(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。

1 个答案:

答案 0 :(得分:2)

问题是你告诉Yii运行MySQL函数插入数据库。它确实很好,但是Yii之后没有重新读取记录以获得价值。重新阅读它将是低效的,因为你正在做的事情并不是很常用,并且通常不需要从数据库中读取数据。你可以通过两种方式解决这个问题:

1)从db中自己读取值。你可以做一个$ model-> save(); $模型 - >刷新();之后,您应该在$ model中获得最新数据

2)你可以让你的功能做一个

public function beforeSave() {
   if ($this->isNewRecord)
       $this->id = Yii::app()->db->createCommand('select UUID()')->queryScalar();

   return parent::beforeSave();
}

我没有测试过这个,但你明白了。

这将转到DB,运行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。