2012-12-22 27 views
13

Trong lớp Repository của tôi, tôi sử dụng đoạn mã sau để truy vấn:thuyết 2: Kết quả truy vấn như mảng kết hợp

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

Kết quả tôi nhận được là một cái gì đó như:

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) 

Nhưng tôi thà có một mảng kết hợp là kết quả:

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

Điều này có thể mà không cần thêm vòng lặp để tạo mảng mong muốn?

Trả lời

2

Thực tế ở đâu đó chuyển vị phải được thực hiện. Xem 14.7.4. Hydration Modes về những gì được trả về bởi ->getResult() và các phương thức/biến thể thay thế nào đã tồn tại.

Bạn cũng có thể thêm chế độ hydrat hóa của riêng mình ở vị trí trung tâm. Điều đó được giải thích trong 14.7.4.5. Custom Hydration Modes.

13

Tôi biết cũ của nó nhưng hôm nay tôi đã phải làm gần như giống nhau, giải pháp của tôi mà không một Hydrator tùy chỉnh

  • INDEX THEO s.term
  • thay đổi getResult() để chắc chắn

như

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

hoặc

$result = $query->getQuery()->getResult(2); 
  • định dạng kết quả

như

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

Pleeeease không sử dụng 'getResult (2)' - thực hành OOP tốt khi có sẵn luôn luôn sử dụng một hằng số để có thể đọc tương lai – jmaculate

7

Nếu bạn muốn một mảng, bạn có thể sử dụng the getArrayResult method.

Lấy mảng kết quả cho truy vấn.

Bí danh để thực thi (null, HYDRATE_ARRAY).

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

Vì vậy, sử dụng phương pháp này sẽ cung cấp cho bạn the exact same result as using the constant HYDRATE_ARRAY.

+0

này sẽ không được trả lại mong muốn định dạng. – Roman

+0

@Roman Tại sao không? – Wilt

+0

Chứng minh cho tôi tôi sai, nhưng tôi nghĩ rằng nó sẽ không trả về mảng kết hợp mong muốn. Tôi đã thử nó và nó sẽ trả về mỗi dòng kết quả như là một phần tử mảng riêng chứa bên trong mảng kết hợp. – Roman

1

Sau nhiều tìm kiếm, tôi đã tìm thấy một số giải pháp cho đối tượng giáo lý để chuyển đổi mảng. Khi chúng ta có các đối tượng liên kết trong kết quả.

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; 

3.

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