2012-12-22 131 views
13

在我的倉庫類我使用下面的代碼查詢:原則2:查詢結果作爲關聯數組

$query = $this->getEntityManager()->createQuery(" 
    SELECT s.term, COUNT(s.term) AS freq 
    FROM App\Entities\SearchTerm s 
    GROUP BY s.term 
    ORDER BY s.term ASC 
"); 

$result = $query->getResult(); 

結果我得到的是這樣的:

array (size=4) 
    0 => 
    array (size=2) 
     'term' => string '' (length=0) 
     'freq' => string '1' (length=1) 
    1 => 
    array (size=2) 
     'term' => string 'foo' (length=3) 
     'freq' => string '1' (length=1) 
    2 => 
    array (size=2) 
     'term' => string 'bar' (length=3) 
     'freq' => string '2' (length=1) 
    3 => 
    array (size=2) 
     'term' => string 'baz' (length=3) 
     'freq' => string '2' (length=1) 

但我寧願有關聯數組作爲結果:

array (size=4) 
    '' => string '1' (length=1) 
    'foo' => string '1' (length=1) 
    'bar' => string '2' (length=1) 
    'baz' => string '2' (length=1) 

這是可能不需要額外的for循環構建所需的數組?

回答

13

我知道它老了,但今天我必須做的差不多了,我的解決方案,無需定製水化

  • INDEX BY s.term
  • 修改的getResult(),以確保

$result = $query->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY); 

$result = $query->getQuery()->getResult(2); 
  • 格式結果

$resultNeeded = array_map(function($value) { return $value['freq']; }, $result); 
+12

Pleeeease不使用'的getResult(2)' - 好OOP做法可用時始終使用常量未來可讀性 – jmaculate

7

如果你願意,你可以使用the getArrayResult method數組。

獲取查詢結果數組。

執行的別名(null,HYDRATE_ARRAY)。

$result = $query->getQuery()->getArrayResult(); 

所以使用這種方法會給你the exact same result as using the constant HYDRATE_ARRAY

+0

這將不會返回所需格式。 – Roman

+0

@羅曼爲什麼不呢? – Wilt

+0

證明我錯了,但我認爲它不會返回所需的關聯數組。 我試過了,它會將每個結果行作爲一個自己的數組元素存放在關聯數組中。 – Roman

1

經過大量的搜索後,我發現一些解決方案教條對象數組轉換。結果中有關聯對象時。

1.

$person = $em->find('Person', 2); 
$da = array(); 
     $person = (array) $person; 
     foreach($person as $i=>$d) { 
      if (is_object($d)) { 
       $d = (array) $d; 
       foreach($d as $si=>$sd){ 
        if (is_object($sd)) { 
         //var_dump('after convert array'); 
         $da[$i][$si] = (array) $sd ; 
         //var_dump($da[$i][$si]); 
        } else { 
         $da[$i][$si] = $sd ; 
         //var_dump($da[$i][$si]); 
        } 
       } 

      } else { 
       $da[$i] = $d; 
       //var_dump($da[$i]); 
      } 
     } 

echo '<pre>'; print_r($da); echo '<pre>'; exit; 

2。

$query = $em->createQuery('SELECT w FROM Person w WHERE w.Id = 2'); 
$person = $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); 
echo '<pre>'; \Doctrine\Common\Util\Debug::dump($person); exit; 

$result = $em->createQueryBuilder(); 
      $person = $result->select('p') 
      ->from('PsnPersonPsn', 'p') 
      ->where('p.Id= 1') 
      ->getQuery() 
      ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY); 
      echo '<pre>'; \Doctrine\Common\Util\Debug::dump($person); exit;