Zend_Db自定义查询到db行而不是数组

时间:2012-06-08 14:41:11

标签: php zend-framework zend-db zend-db-table

当我在我的DbTable上调用fetchAll()时,我得到DbTable中定义的正确DbRow类的结果。

但是当我创建这样的自定义查询时,我得到了数组中的结果。是否有任何参数可以强制接收DbRows中的数据,或者我应该自己创建行并用这些数组填充它们?

$query = $this->_dbTable->getDefaultAdapter()->select()
        ->from('doctor.doctor')
        ->joinInner('facility.doctorfacility', 'facility.doctorfacility.doctor_id = doctor.doctor.id')
        ->joinInner('facility.facility', 'facility.doctorfacility.facility_id = facility.facility.id')
        ->where(implode(' AND ', $conds));

return $this->_dbTable->getDefaultAdapter()->fetchAll($query);

2 个答案:

答案 0 :(得分:3)

  

“但是当我创建这样的自定义查询时,我会得到数组中的结果”

您正在获取一个数组,因为您正在调用Zend_Db_Adapter_Abstract::fetchAll(),根据代码中的docblock返回一个数组: -

/**
 * Fetches all SQL result rows as a sequential array.
 * Uses the current fetchMode for the adapter.
 *
 * @param string|Zend_Db_Select $sql  An SQL SELECT statement.
 * @param mixed                 $bind Data to bind into SELECT placeholders.
 * @param mixed                 $fetchMode Override current fetch mode.
 * @return array
 */
public function fetchAll($sql, $bind = array(), $fetchMode = null)
  

“当我在我的DbTable上调用fetchAll()时,我得到DbTable中定义的正确DbRow类的结果。”

执行此操作时,您正在调用Zend_Db_Table_Abstract::fetchAll(),根据代码中的docblock返回Zend_Db_Table_Rowset: -

/**
 * Fetches all rows.
 *
 * Honors the Zend_Db_Adapter fetch mode.
 *
 * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
 * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
 * @param int                               $count  OPTIONAL An SQL LIMIT count.
 * @param int                               $offset OPTIONAL An SQL LIMIT offset.
 * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
 */
public function fetchAll($where = null, $order = null, $count = null, $offset = null)
  

“是否有任何参数可以强制接收DbRows中的数据,或者我应该自己创建行并用这些数组填充它们?”

没有,但如果您在正确的对象上调用正确的方法,则会返回您的行集。

要执行此操作,请更改此行: -

$query = $this->_dbTable->getDefaultAdapter()->select()

要: -

$query = $this->_dbTable->select()

这一行: -

return $this->_dbTable->getDefaultAdapter()->fetchAll($query);

要: -

return $this->_dbTable->fetchAll($query);

那应该能满足你的需求。如果您遇到ZF,总是值得查看代码,这是迄今为止最好的文档。

答案 1 :(得分:1)

您不能强制它,因为数据来自多个表,因此zend_db无法进行映射。它留给我们将数据映射到实体。

如果您需要对象数组,则可以更改提取模式。

  

Zend_Db :: FETCH_OBJ:返回对象数组中的数据。默认   class是PHP内置类stdClass。结果集的列   可用作对象的公共属性。

仅供参考:Fetch Mode

某些框架就像Doctrine一样,允许我们提供mapper,我们可以在这里传递自定义mapper对象。