2011-08-23 111 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类。那么至少它更容易理解为什么它很尴尬。你可以写一个便笺给自己重新构造一段时间。 –