就像这样写一个查询:
$q = Doctrine_Query::create()
->select('r.title, r.title_safe, r.description')
->from('Regions r')
->where('pr.page_id = ?', 1)
->leftJoin('r.Page_regions pr');
$results = $q->execute(array(), Doctrine::HYDRATE_ARRAY);
,但我想$results作为对象。我该怎么办?
使用不带参数的execute方法。
q -> execute (),
$q = Doctrine_Query::create()
->select('r.title, r.title_safe, r.description')
->from('Regions r')
->where('pr.page_id = ?', 1)
->leftJoin('r.Page_regions pr');
$q = $q->getQuery()->getResult();
您正在使用HYDRATE_ARRAY
标志,它将所有结果作为数组返回。您可以省略此标志以使结果作为对象返回。
因为Doctrine_Query::execute()
返回一个Doctrine_Collection对象,你可以调用许多方法来获得你想要的结果(参见Doctrine_Collection API文档)。如果您只想要单个结果,请尝试这样做:
$q = Doctrine_Query::create()
->select('r.title, r.title_safe, r.description')
->from('Regions r')
->where('pr.page_id = ?', 1)
->leftJoin('r.Page_regions pr');
/* @var Doctrine_Record */
$results = $q->execute()->getFirst();
我认为有一种方法可以获得PDOStatement
表示。让我再给你答复。
$objs = array();
foreach ($q->fetchArray() as $arr) {
$objs = (object)$arr;
}
- Edit -
找不到它。但是您可以扩展Doctrine_Query
类。
class App_Doctrine_Query extends Doctrine_Query
{
public function fetchObjects(array $params = array())
{
return array_map(array($this, 'convertArrayToObject'), $this->fetchArray($params));
}
private function convertArrayToObject(array $arr)
{
$obj = new stdClass();
foreach ($arr as $key => $val) {
if (is_array($val)) {
$val = $this->convertArrayToObject($val);
}
$obj->$key = $val;
}
return $obj;
}
}
然后在bootstrapper中添加如下内容:
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');