2013-02-06 43 views
2

我的情況: 我有一個基於幾個模型鏈接在一起的形式。 在後臺我有一個保存圖像的例程,基於ajax調用一個特定的控制器上傳圖像並實時顯示在textarea上。 我的問題適用於首次保存記錄時,因爲ajax例程需要知道記錄的ID以關聯圖像,但只有在調用save()後纔會創建該記錄。 在模型保存前有沒有辦法獲取ID?或者一些其他的解決辦法CakePHP需要在保存前知道型號ID

在此先感謝大家

魯迪

回答

3

我認爲@RichardAtHome提供了一個很好的輸入。我將添加您可能想要考慮的第三種解決方案:

對該模型的主鍵使用通用唯一標識符(UUID)。 CakePHP提供了一種通過String實用程序生成它們的方法。所以你要做的是在頁面加載String::uuid()時生成id,然後將它作爲ajax請求的一部分發送。

+1

謝謝您的建議:我已經使用這種方法,現在所有的作品都像一個魅力!謝謝 – Rudy

+1

額外的想法:使用String :: uuid()時,檢查數據庫表中是否存在這個id。我認爲獲得非唯一ID的機會非常非常小,但它仍然是一個機會。而編程時,我不相信「機會」,我想100%控制發生的事情。所以這可能是使用這種方法時要考慮的問題:) – Jelmer

+0

@jelmer UUID有122位熵,所以兩個隨機UUID碰撞的機會大約是10^-37,我會冒險 - 或者購買一張彩票 – user3662662

2

一對夫婦的解決方案:

  1. 更改您的工作流程,使圖像只能鏈接到主模型一旦主模型被保存(並且有一個id)。

  2. 在創建主模型之前,不要將圖像保存到數據庫。您可以將它們存儲在一個會話中,或者在用戶添加更多字段時將字段添加到表單末尾。

0

大概不會,因爲ID將被數據庫進行設置,而不是CakePHP的,並經過數據庫自動遞增的ID字段中的ID只能被稱爲...

不知道你的流程如何,但我猜你可以在控制器獲取頁面時(當$ this-> data爲空時)將一個虛/空行保存到數據庫中,而不需要所有關聯。您知道ID爲數據庫中的一個空行,如「12,NULL,NULL,NULL,NULL,NULL ...」。然後,您可以存儲該虛擬記錄的ID(或者執行$ this-> set(「id」,$ id)將其傳遞到您的ajax調用中使用的視圖)。 頁面的POST之後,您可以使用該ID存儲在虛擬行的所有其他信息,或在出現故障時從數據庫中刪除虛擬行/用戶瀏覽了......

2

選項1:

您可以嘗試使用UUID而不是INT。這樣,您可以使用CakePHP生成一個ID:String::uuid();

創建它後,您可以填充一個id字段,然後使用該ID保存項目。

我不確定如果我在做銀行軟件或者其他重要的事情時,我會依賴它的獨特性,但是 - 它有十億分之一的機會被複制,而對於普通的網站/軟件,它似乎是那就夠了。

選項2:

在有很多我們的項目,我們已經發現它有助於有一個非常簡單的「創造物」只是一個標題字段頁,然後,保存一次,他們花立即進入更深入的「編輯」頁面,在那裏他們可以上傳文件,保存額外的數據等等等等。幾乎就像pg1,pg2一樣。這樣,文件以及任何其他動態ajax驅動的數據都將具有可用的ID。

相關問題