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

时间:2011-05-24 11:39:05

标签: php zend-framework zend-db

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

$union_select = $PagesTable->getAdapter()->select()
        ->union(array('(' . $legal_resources_select . ')', '(' . $pages_select . ')'));
$PagesTable->getAdapter()->fetchAll($union_select)

$PagesTable延伸Zend_Db_Table_Abstract。完整选择太大了,无法在此发布,我认为这与这个特定问题无关。如果我错了,请告诉我。

目前这是返回一个结果数组,但我希望它返回一个rowset对象。我还必须能够指定$_rowClass。这是必要的,因此我可以添加格式化和操作返回值的方法。

这可能吗?

3 个答案:

答案 0 :(得分:5)

你做不到。你要获取的结果集是一个复合,而不是来自数据库的一组行,所以即使它是可能的,这也是一个非常糟糕的主意。

Zend_Db_Table是Table Data Gateway模式的一种实现,而不是Active Record。

您所描述的内容通常可以在Active Record下进行,为此,我建议您查看Doctrine 1.2而不是Zend_Db_Table。

答案 1 :(得分:1)

BTW,如果要指定rowClass或rowsetClass,可以通过调用以下方法使用Zend_Db_Table类来实现

使用Zend_Db_Table的方法setRowsetClasssetRowClass

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");

答案 2 :(得分:0)

顺便说一句,我知道这已经过时了,但是访问此页面的人应该知道,Zend_Db_Adapter总是返回数组,所以当你使用Zend_Db_Table::getAdapter方法时,你是实际上远离你的表类并使用返回数组的适配器类中包含的fetch方法,而不是返回数据网关模式下的对象的Zend_Db_Table::_fetch

所以第一个答案是错误的,结果集将是一个包含许多行对象的行集,但没有什么学说调用数据水合,所以期望行对象上有许多冗余数据。

我看到很多人在我工作的地方犯了这个错误,我想知道为什么这么多人使用getAdapter方法。另外要提到的是,当您使用getAdapter获取选择对象时,您没有获得正确的选择对象,而是获得Zend_Db_Select并且您需要Zend_Db_Table_Select因此,您可以使用Zend_Db_Table::_fetchfetchAll方法使用的fetchRow方法。

干杯。