2010-03-05 34 views
-1

我使用Cake 1.2.6,昨天晚上我注意到當我提交一個表單時,HABTM關係沒有被保存。__saveMulti()期間HABTM數據損壞?

我在CommitteeVolunteer之間有HABTM關係。 Volunteer的主鍵是UUID,而Committee的主鍵是人類可讀的字符串(例如BOARDOFDIRECTORS,FAIRCOMMITTEE,FAIRCOMMITTEE,FAIRASSOCIATES等)。我有一個表單來創建/編輯志願者,並且該表單包含一個選擇框,其選項與您期望的完全相同,並且填充了從Cake的find('list')方法返回的選項。雖然我想不出一個重要的原因,但只有一個委員會可以選擇成爲一名志願者(HABTM滿足未來的需求)。

初步結果顯示,選擇BOARDOFDIRECTORS選項可按預期工作,但其他選項不會。通過核心代碼跟蹤執行使我Model->__saveMulti()其中,在Line 1393,執行該代碼:

$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id; 

如果我的代碼之前轉儲$data,輸出爲FAIRASSOCIATES。緊隨其後,其價值是4AIRASSOCIATES。假設這就是爲什麼這種關係沒有被保存似乎是安全的,但我還沒有弄清楚爲什麼數據在執行的這一點上正在發生變化。

有沒有其他人看到過這個?我錯過了一些關鍵的作品嗎?據我所知,這在v1.2.1中工作正常(我在一週前左右升級)。

UPDATE

表觀古怪我看到的第一個比特是,儘管我的$row是一個字符串,在Line 1366條件計算結果爲true所以我拖放到該代碼塊。如果我的數據是一個字符串,它如何具有成員值?

UPDATE

我顯然有一些思考的事,但這裏的底線。如果我放棄日誌寫入立即之前和之後立即Line 1394像這樣:

$this->log('Setting ' . $data . '[' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] . '] = ' . $id, LOG_DEBUG); 

$data[$this->hasAndBelongsToMany[$assoc]['foreignKey']] = $id; 

$this->log('Creating ' . json_encode($data) . ' on ' . $join, LOG_DEBUG); 

相關的輸出是:

2010-03-05 18:57:08 Debug: Setting FAIRASSOCIATES[volunteer_id] = 4b78717f-8ad4-4671-b81c-4e8745591fb4 
2010-03-05 18:57:08 Debug: Creating "4AIRASSOCIATES" on CommitteesVolunteer 

可能的問題:

  1. 我不知道如何/爲什麼Cake正試圖設置volunteer_id成員的字符串
  2. 「FAIRASSOCIATES」是一個委員會的ID,一個志願者呃被分組,不是任何類型的模型,所以我根本不明白FAIRASSOCIATES[volunteer_id]的相關性。
  3. 我不知道如何或爲什麼$data的價值被變換爲4AIRASSOCIATES那一行代碼。

回答

0

看起來我的問題是由於做非常規的事情造成的。對於數值很少變化的查找表(並且他們沒有計劃通過應用程序這樣做),我喜歡PK值是人類可讀的。這允許我直接在數據庫中查看數據,並以有意義的方式讀取相關記錄。在這種情況下,我可以查看Volunteer記錄,並且在不需要任何形式的聯接的情況下,看到他/他在名爲FAIRCOMMITTEECommittee中。在應用程序之外查看數據時有用。

在這種情況下,我的3 Committee值中的一個恰好是16個字符長 - CakePHP解釋爲UUID的長度 - 因此它的行爲正確。其他人不是16個字符,行爲不正確。

失敗的條件是Line 1355。我已輸入a ticket以查看UUID檢測情報是否有改進空間。

1

我寫了一個小的修復程序,它在TESTING中(atm它的工作原理):它覆蓋了uuid檢測(愚蠢的IF只是詢問數據是16長度還是32長度)並且假設它是一個有效的ID輸入數據的字符串或數字。

剛纔添加的功能(複製整個功能):

功能__saveMulti($加盟,$ id)的

從LIB的model.php到應用的app_model.php

然後在model.php行1355中替換以前的IF:

if((is_string($ row)& &(strlen($ row) == 36 || strlen($ row)== 16))|| is_numeric($行)){

現在你的app_model.php這一個(不編輯您的lib的model.php,在你app_model.php做到這一點):

IF((IS_STRING( $行)& &((strlen($ row)== 36 || strlen($ row)== 16)||!$ this - > {$ assoc} - > autoPrimaryKey))||(is_numeric($ row) )){

然後在app_model.php添加此變量:

var $autoPrimaryKey = true; 

,並希望此行爲添加相同的變量,但假的,它會asume這並不具備自動模型生成UUID爲HABTM並修復問題

var $autoPrimaryKey = false; 
模型

我再說一遍,這只是在測試一個解決方法,它解決了這個問題對我來說,你有任何問題,將它發送到我的郵箱zydriel AT gmail.com

+0

很好的解決方案,何塞。我的意圖是以類似的方式來覆蓋這一點,但我還沒有決定採取一種方法。這看起來很好,正在進行一些廣泛的測試 – 2010-03-12 23:28:00