想要写一个查询作为Doctrine中的对象返回

时间:2011-08-26 13:21:12

标签: php codeigniter 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作为对象。我能怎么做?

4 个答案:

答案 0 :(得分:1)

只使用不带参数的execute方法。

$ Q->执行();

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您正在使用HYDRATE_ARRAY标志,该标志将所有结果作为数组返回。您可以省略此标志以将结果作为对象返回。

因为Doctrine_Query::execute()返回一个Doctrine_Collection对象,所以可以调用许多方法来获得所需的结果(参见Doctrine_Collection API Documentation)。如果您只想要一个结果,请尝试以下方法:

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

答案 3 :(得分:0)

我认为有办法获得PDOStatement表示。让我回答你。

在此期间,这是一个快速解决方案。但这只适用于来自实际模型的数据(关系数据将是对象的数组)。

$objs = array();
foreach ($q->fetchArray() as $arr) {
    $objs = (object)$arr;
}

- 编辑 -

无法找到它。但你可以扩展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;
    }
}

在你的引导程序中,你会添加如下内容:

$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');