【问题标题】:Best approach dealing with joins in Zend Framework?Zend 框架中处理连接的最佳方法?
【发布时间】:2010-02-24 14:01:27
【问题描述】:

嗯,这更像是一个设计问题。 我知道在 Zend 框架中使用连接有两种方法

  1. 使用 Zend 表的实例(其 Select obj)处理它
  2. 使用 Zend Db 的实例(它的 Select obj)处理它

在第一种方法中,这对我来说似乎真的很奇怪——某些表也必须与其他表打交道,这不是很好,很混乱,至少在我阅读方法名称 getData() 时——我认为它处理使用自己的数据。

第二个更好,你可以有一些充当服务的类——NodeService,它会处理表 node 和 node_translation ,但也产生了一个问题,为什么在这种情况下我们需要 Zend Table。 我希望我能很好地解释自己 谢谢。

【问题讨论】:

    标签: php zend-framework oop coding-style


    【解决方案1】:

    从技术上讲,您指的是Zend_Db_SelectZend_Db_Table_SelectZend_DbZend_Db_Table 不允许加入。

    来自ZF manual on the Select API in chapter Zend_Db_Table

    Zend_Db_Table_Select 对象是 Zend_Db_Select 对象的扩展,它将特定限制应用于查询。增强和限制是:

    • 您可以选择在 fetchRow 或 fetchAll 查询中返回列的子集。在不希望为所有列返回大量结果的情况下,这可以提供优化优势。
    • 您可以指定对选定表中的表达式求值的列。但是,这意味着返回的行或行集将是只读的,不能用于 save() 操作。如果尝试进行 save() 操作,具有 readOnly 状态的 Zend_Db_Table_Row 将抛出异常。
    • 您可以在 select 上允许 JOIN 子句以允许多表查找。
    • 您不能指定 JOINed 表中的列在行/行集中返回。这样做会触发 PHP 错误。这样做是为了确保 Zend_Db_Table 的完整性得以保留。即 Zend_Db_Table_Row 应该只引用从其父表派生的列。

    主要区别在于,Zend_Db_TableZend_Db_Table_Select 充当 Table Data Gateway,它允许直接访问表及其行并允许调用方法来处理表,而 Zend_Db_Select 不是而且是独立。

    【讨论】:

    • 是的,你的指点很清楚,只是不想详细说明,但主要问题仍然是关于在哪里使用连接的方法
    • @simple 对不起。我认为这从我的回答中很清楚。当您不需要表数据网关的额外好处时,请使用 Zend_Db_Select。
    • 我个人 90% 的时间都使用 Zend_Db_Table_Select(基本上我所有的模型都扩展了 Zend_Db_Table_Abstract,除了处理 xml 数据的模型)。我已经习惯了,尽管 Zend_Db_Select 在大多数情况下可能也很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多