2014-02-27 60 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

我編輯了答案,抱歉,我從來沒有嘗試過,我忘了我需要做一個選擇:)。很高興你有它的工作。 –