2014-02-27 38 views
1

我能够将数据保存到数据库,并在主键列(id)中创建一个uuid。当我调用$ model-> save();并获得$模型 - > ID之后,将返回:Yii uuid模型保存返回null为主键

{"expression":"UUID()","params":[]} 

应该在数据库返回的实际值。我怎样才能得到实际值,MySQL的商店?

我有一个beforeSave功能,在UUID补充说:

public function beforeSave() { 
    if ($this->isNewRecord) 
     $this->id = new CDbExpression('UUID()'); 

    return parent::beforeSave(); 
} 

我也试图创造更新之前执行的ID MySQL的UUID功能的触发...的$模型 - > ID,然后在返回null。

+0

是数据库中的主键吗? –

+0

@RafayZiaMir是的id是主键 –

+0

,你可以解释$ this-> id = new CDbExpression('UUID()');这条线正在做什么?你是否将ID设置为CDbExpression的实例? –

回答

2

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

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

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服务器在所有,但由于您使用的列,作为标识,你可能想UUID()产生一个真正独特的ID。

+0

非常好的布局答案。尝试了很多东西,我认为选项2就是我要做的。 –

+0

我编辑了答案,抱歉,我从来没有尝试过,我忘了我需要做一个选择:)。很高兴你有它的工作。 –