我有一个结果集,它是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
。这是必要的,因此我可以添加格式化和操作返回值的方法。
这可能吗?
答案 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的方法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");
答案 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::_fetch
和fetchAll
方法使用的fetchRow
方法。
干杯。