2011-08-23 30 views
1

我有一個模型(稱爲Model_A),用於在由$ name var定義的特定表格上進行CRUD。如果另一個模型中的第一個操作成功,我還需要更新另一個表(將其稱爲Model_B,使用不同的$ name var)。Zend框架 - 更新來自同一模型的兩個表格

我試圖從類Model_A中的操作更新Model_B中表示的表。我正在通過在Model_A中的一個動作中創建一個Model_B的實例來實現這一點。更新操作失敗失敗,因爲它似乎嘗試從Model_A寫入表$ name,而不是Model_B實例的表$ name。

我想我可以將第一次更新的結果傳遞迴控制器,然後轉到第二個模型,但我寧願同時進行兩次更新。

除了我的編碼錯誤,是否有任何明顯的原因,爲什麼我的第二次更新沒有找到正確的表..這是我想要做的事情的合理意見?

回答

3

大多數人認爲模型與表類一致。實際上,他們讓擴展了一個基表類。對於大多數簡單的CRUD類型的工作,這或多或少都是好的。但是當你在多個表或交易腳本中進入更復雜的更新時,你會發現像你所詢問的那種尷尬的情況。其實一個模型不是表格。模型是應用程序業務的某個邏輯部分的封裝,而不是將其存儲在數據庫中的實現。

幾年前,我開始研究Zend_Db_Table的代碼,當我編寫手冊時,我很小心而不是將表類作爲模型來引用。

因此,您可能需要引入一個真正的Model類層(它不擴展基類),它知道如何針對一個或多個數據庫表執行特定於應用程序的操作,但它不是您的應用程序的Controller。

Controller -> Model -> Table(s) 

如果您有類似的業務任務從多個控制器調用,此架構是一種避免重複代碼的好方法。它有助於從控制器中分離應用程序功能和持久性細節,這有助於代碼維護,可測試性,封裝等。

查看免費迷你書籍Domain-Driven Design Quickly(基於Eric Evans書籍)或章節「魔豆「在我的書中,SQL Antipatterns: Avoiding the Pitfalls of Database Programming

+0

感謝您的意見的一個重要性質 - 我希望有一個簡單的「只是使用這種automagic方法「。由於我在這個項目上受到時間的限制,我可能不得不回到兩個模型之間的控制器。但是,是的,在一個理想的世界裏,一個完全自定義的模型可能更適合這個任務。並感謝鏈接! – Owen

+1

當然,我明白需要「去呃」完成,這可能會導致我們偷工減料。請注意,您擁有的代碼正確地屬於它自己的Model類中,您可以將它們推入Table類或推入Controller類。那麼至少它更容易理解爲什麼它很尷尬。你可以寫一個便箋給自己重新構造一段時間。 –