2010-05-11 126 views
2

我在處理cakephp中的間接關聯模型時遇到了一些問題。我目前的模型設置如下:CakePHP:間接關聯模型的缺點

Deliveries hasOne License 
License belongsTo Delivery 
License hasAndBelongsToMany Product (and vice-versa) 
License hasAndBelongsToMany ProductOption (and vice-versa) 

我試圖保存有關所有這些模型內一個窗體的信息。我遇到的缺點如下:

  1. 表單助手似乎只能看到字段類型深一級。

  2. saveAll()似乎只能將記錄保存到一個深度級別(對於多個模型表單)。

我到處搜尋,爲解決這些問題,但由於我是新來CakePHP的,我不知道有什麼最新的方法或「正確」的方法是處理這些問題。

任何意見是非常感謝。謝謝你們!

編輯:我已經發布代碼到我的失敗嘗試在這裏:http://bin.cakephp.org/saved/58501

+0

你能從你的表單發佈一些代碼嗎?在這種情況下,License也意味着什麼? – jimiyash 2010-05-11 23:57:53

+0

我的公司通常對軟件「許可證」進行物理「交付」,使客戶可以運行他們購買的不同類型的軟件「產品」以及購買的「產品選項」。 – Dan 2010-05-12 00:14:41

回答

0

白水()似乎只能夠保存記錄的一個深層次(多個模型的形式)。

我在過去偶然發現了這個限制,並選擇了在當時通過將我的表格拆分爲多個更小的表格來解決它。

使用saveAll和InnoDB表時需要注意的一件事是您可以獲得原子事務,因爲如果Cake無法將更改提交到數據庫,它將執行回滾。

所以,雖然你可以很明顯地用你自己的代碼的幾行解決問題(因爲Cake的saveAll單行不符合預期),如果事務是一個需求,你將不得不花更多的時間。

0

嗨,我知道這是一箇舊的帖子,但我認爲我會張貼這個來幫助他人,至於CakePHP 2.1,您可以使用saveAll()調用一個選項保存多級模型關聯: http://book.cakephp.org/2.0/en/appendices/new-features-in-cakephp-2-1.html#model-saveall-model-saveassociated-model-validateassociated

例子:

$this->MyModel->saveAll($this->request->data, array('deep'=>true)); 

對於表單助手的限制,我像失去了有你在,我可能會採取手動設置輸入類型,我的領域並不需要太多的驗證。