我創建了一個crud系統。在這裏我有一個主要模型,然後依賴於細節模型。因此,它們是多行(有時大於100)輸入與父模型相關的詳細模型。所有操作通過網格處理(內聯編輯)。因此,通過單個請求(通過數據庫進行邏輯檢查)執行創建,更新和刪除操作。控制器中的數據庫事務
現在我正在考慮使用DB事務處理整個操作。但我很困惑,我如何能夠使用相同的結構來實現這一點。我已經有建議將我的所有代碼移到一個模型中,因此可以在那裏應用事務。但我想,如果可以使用其他方法來保留主要和詳細模型代碼的分離。
我創建了一個crud系統。在這裏我有一個主要模型,然後依賴於細節模型。因此,它們是多行(有時大於100)輸入與父模型相關的詳細模型。所有操作通過網格處理(內聯編輯)。因此,通過單個請求(通過數據庫進行邏輯檢查)執行創建,更新和刪除操作。控制器中的數據庫事務
現在我正在考慮使用DB事務處理整個操作。但我很困惑,我如何能夠使用相同的結構來實現這一點。我已經有建議將我的所有代碼移到一個模型中,因此可以在那裏應用事務。但我想,如果可以使用其他方法來保留主要和詳細模型代碼的分離。
至於我的最後一條評論,將代碼移到父模型是我現在的解決方案。所以我認爲我應該標記這個答案。
您是否在使用AJAX進行更改或者是否依賴手動表單提交?
您可以使用所謂的UnitOfWork模式。
保存用戶對網格的每一行所做的任何更改,但實際上並未將它們提交到數據庫。然後,在頁面上放置一個基因保存按鈕,這將使您的服務器通過事務實際提交所有更改。
您可以保留用戶更改每行的列表服務器端。你不需要跟蹤所有的行,因爲如果他們不改變任何東西,你不需要保存任何東西。
你在模型中使用什麼樣的方法?你的模型是否知道他們自己的持久性(你是否像$user->save()
那樣做),或者你在做更多的數據映射器方法($userManager->save($userEntity)
)?後者使事務處理更容易。
如果您正在使用活動記錄類型的模式($user->save()
),最好的辦法可能是手動獲取數據庫連接並管理控制器中的事務。
如果你正在做數據映射的東西,你有更多的選擇,直到幷包括做一個完整的工作單元的實現。
在Zend 2 Framework中,我們在模型的SaveModule方法中使用了類似 $ this-> update($ array,array('id'=> $ module_details-> id))。所以看起來像一個混合的方法比較Zend 1. –
保存後,我剛剛將我的細節模型保存方法從控制器調用到父模型。看起來這只是簡單的解決方案,我有:)。 –