想在Doctrine中编写一个查询返回作为对象


Want to write a query returns as object in Doctrine

就像这样写一个查询:

$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');