我正在尝试查询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。
答案 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。