2014-02-24 46 views
0

我想查詢一組ID,並希望有一個結果看起來數組一樣:選擇標識

陣列(1,2,3,4,5,6,7)

但是我收到是

陣列(陣列( 'ID'=> 1),陣列( 'ID'= 2));

查詢我使用看起來像這樣的內容:

$qb = $this->createQueryBuilder('b') 
      ->select('b.id') 
      ->where('b.game = :gID') 
      ->setParameter('gID', $game->getId()); 
    return $qb->getQuery()->getResult(); 

什麼是達到想要的結果的最佳方式。它也應該是高性能的,因爲這個查詢會加載多達50萬個ID。

回答

0

可以使用array_map功能行映射到平面數組:

var_dump(
    array_map(
    function($element) { 
     return $element['id']; 
    }, array(array('id' => 1), array('id' => 2)) 
) 
); 

結果:

array(2) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(2) 
} 
+0

謝謝,我想出瞭解決方案。想想也許我可以直接從教條中得到它。 – m0c

+0

不幸的是,即使您選擇單列的投影,您從數據庫中獲得的數據行(數組)也不是標量集。 – ziollek

+0

他應該編寫自定義水合模式。請看我的答案。 – NHG

0

這是默認主義hydration modes不可能的。學說有可能寫Custom Hydration Mode意圖達到像你的目標。所以,你必須編寫自定義的水化模式:

#app/config/config.yml 
doctrine: 
    orm: 
     ... 
     entity_managers: 
      default: 
       auto_mapping: true 
       hydrators: 
        MyHydrator: App\YourBundle\Hydrators\MyHydrator 

保溼:

// App\YourBundle\Hydrators\MyHydrator.php 
namespace App\YourBundle\Hydrators; 
use Doctrine\ORM\Internal\Hydration\AbstractHydrator; 
use \PDO; 

class MyHydrator extends AbstractHydrator 
{ 
    protected function hydrateAllData() 
    { 
     $result = array(); 
     $cache = array(); 
     foreach($this->_stmt->fetchAll(PDO::FETCH_ASSOC) as $row) { 
      $this->hydrateRowData($row, $cache, $result); 
     } 

     return $result; 
    } 

    protected function hydrateRowData(array $row, array &$cache, array &$result) 
    { 
     if(count($row) == 0) { 
      return false; 
     } 
     $result[] = $row['id0']; 
    } 
} 

,簡單地用途:

$results = $this->getDoctrine()->getManager() 
    ->createQuery('{yourQuery}')->getResult('MyHydrator'); 

,或者在你的情況下,你的實體倉庫:

$qb = $this->createQueryBuilder('b') 
      ->select('b.id') 
      ->where('b.game = :gID') 
      ->setParameter('gID', $game->getId()); 
return $qb->getQuery()->getResult('MyHydrator'); 

更多在這example