选择一个ID数组

时间:2014-02-24 19:47:32

标签: php symfony doctrine-orm

我正在尝试查询ID数组,并希望得到一个看起来像的结果:

  

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

但我得到的是

  

array(array('id'=> 1),array('id'= 2));

查询我正在使用的内容如下所示:

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

实现想要结果的最佳方法是什么?它也应该是高性能的,因为这个查询将加载多达50万个ID。

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

默认情况下,Doctrine 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