Php 在执行联合查询时,如何让Zend Db返回行集而不是数组?
我有一个结果集,它是MySQL联合查询的结果。我用来获取数据的代码是: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
$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