Php 在执行联合查询时,如何让Zend Db返回行集而不是数组?

Php 在执行联合查询时,如何让Zend Db返回行集而不是数组?,php,zend-framework,zend-db,Php,Zend Framework,Zend Db,我有一个结果集,它是MySQL联合查询的结果。我用来获取数据的代码是: $union_select = $PagesTable->getAdapter()->select() ->union(array('(' . $legal_resources_select . ')', '(' . $pages_select . ')')); $PagesTable->getAdapter()->fetchAll($union_select) $PagesT

我有一个结果集,它是MySQL联合查询的结果。我用来获取数据的代码是:

$union_select = $PagesTable->getAdapter()->select()
        ->union(array('(' . $legal_resources_select . ')', '(' . $pages_select . ')'));
$PagesTable->getAdapter()->fetchAll($union_select)
$PagesTable
扩展了
Zend\u Db\u Table\u Abstract
。完整的选择太大,无法在这里发布,我认为它与这个特定的问题无关。如果我错了,让我知道

目前,这将返回一个结果数组,但我希望它返回一个行集对象。我还必须能够指定
$\u rowClass
。这是必要的,这样我就可以添加格式化和操作返回值的方法


这可能吗?

你不能。您正在获取的结果集是一个组合,而不是数据库中的一组行,因此即使可能,这也是一个非常糟糕的想法

Zend_Db_Table是表数据网关模式的一种实现,而不是活动记录


您所描述的内容通常在活动记录下是可能的,为此,我建议查看原则1.2,而不是Zend_Db_Table。

顺便说一句,如果您想指定rowClass或rowsetClass,您可以通过调用以下方法来使用Zend_Db_Table类

使用Zend_Db_Table的方法
setRowsetClass
setRowClass

class RowTable extends Zend_Db_Table_Abstract {
    private static $_instance;
    protected $_name = "tableName";
    protected $_primary = "primary_key_id";

    # over-write the default class Zend_Db_Table_Rowset_Abstract
    # make sure the following classes are inside the include-path
    private function __construct($rowClass, $rowsetClass) {
        $this->setRowsetClass("ContributionList");
        $this->setRowClass("Contribution");
    }
}

$tableObject = new RowTable("RowClass", "RowsetClass");

顺便说一句,我知道这是非常古老的,但是进入这个页面的人应该知道,
Zend_Db_Adapter
总是返回数组,所以当你使用
Zend_Db_Table::getAdapter
方法时,你实际上是在远离你的Table类,而使用Adapter类中包含的fetch方法返回数组,而不是返回数据网关模式下的对象的
Zend\u Db\u表::\u fetch

因此,第一个答案是错误的,结果集将是一个包含许多行对象的行集,但没有信条所称的数据水合作用,因此在行对象上会有许多冗余数据

我看到我工作的很多人都犯了这个错误,我想知道为什么这么多人使用
getAdapter
方法。另一件需要提及的事情是,当您使用
getAdapter
获取select对象时,您没有获得正确的select对象,您将获得一个
Zend\u Db\u Select
,您将需要一个
Zend\u Db\u Table\u Select
,以便您可以在
Zend\u Db\u Table上使用::\u fetch
方法,该方法由
fetchAll
fetchRow
方法使用


干杯。

或作为类属性,例如
$\u rowClass