2011-08-26 66 views
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'); 

$results = $q->execute(array(), Doctrine::HYDRATE_ARRAY); 

,但我想$结果对象。我能怎么做?

回答

1

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

$ q-> execute();

+0

这不是给相同的结果阵列。只想返回字段。 – MAB

+0

你是什么意思'只想返回领域? – xdazz

+0

希望得到与execute(array(),Doctrine :: HYDRATE_ARRAY)相同的结果; 像: 阵列 ( [0] =>数组 ( [ID] => 1 [标题] =>标题 [title_safe] =>头 [描述] => Sayfa UST BARI ) 但我不想得到结果像数组我想要得到的结果像对象 – MAB

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(); 
+0

致命错误:调用成员函数getResult()对一个非对象 – MAB

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