我有一个模型(称之为Model_A),我在$ name var定义的特定表上用于CRUD。如果另一个模型中的第一个操作成功,我还需要更新另一个表(用不同的$ name var称它为Model_B)。
我正在尝试从Model_A类中的操作更新Model_B中表示的表。我这样做是通过在Model_A中的一个动作中创建Model_B的一个实例。更新操作失败失败,因为它似乎尝试从Model_A写入表$ name,而不是从Model_B的实例写入表$ name。
我想我可以将第一次更新的结果传回控制器,然后转到第二个模型,但我宁愿同时进行两次更新。
除了我的编码错误外,还有任何明显的原因导致我的第二次更新找不到合适的表格吗?这对我想做的事情是否合理?
答案 0 :(得分:3)
大多数人认为 Model 与表类一致。实际上,它们使模型扩展成为基表类。对于大多数简单的CRUD类型的工作,这或多或少都很好。但是当您在多个表或事务脚本中进行更复杂的更新时,您会发现类似于您所询问的尴尬情况。
事实上,模型不是表。模型是应用程序业务的某些逻辑部分的封装,而不是将其存储在数据库中的实现。
几年前我在Zend_Db_Table的代码上工作了很多,当我编写手册时,我小心不将表类称为模型。
因此,您可能需要引入一个真正的Model类层(它不扩展基类),它知道如何针对一个或多个数据库表执行某些特定于应用程序的操作,但它不是您的应用程序的Controller。
Controller -> Model -> Table(s)
如果您具有从多个控制器调用的类似业务任务,则此体系结构是避免重复代码的好方法。它有助于将应用程序功能和持久性细节与控制器分离,这有利于代码维护,可测试性,封装等。
查看免费迷你书Domain-Driven Design Quickly(基于Eric Evans书籍)或我书中的“Magic Beans”章节SQL Antipatterns: Avoiding the Pitfalls of Database Programming。
答案 1 :(得分:2)
Zend_Db_Table有一个名为“RefrenceMap”的重要属性,你可以在其中定义一个表如何链接到另一个表的逻辑,检查下面的url以进一步阅读 http://framework.zend.com/manual/en/zend.db.table.relationships.html