如何在 Doctrine 中获取像 PDO::FETCH_COLUMN 这样的值?
How to fetch values likes PDO::FETCH_COLUMN in Doctrine?
我有以下代码:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery();
我想获得类似 [ 'EN', 'FR', 'US' ]
的东西,就像 PDO::FETCH_COLUMN
会 return 一样。我尝试了 getScalarResult()
,但 return 的结果与 getArrayResult()
:
相同
array (size=2)
0 =>
array (size=1)
'country' => string 'DE' (length=2)
1 =>
array (size=1)
'country' => string 'MM' (length=2)
我尝试使用 execute()
,正如我在一些示例中看到的那样,但它 return 的结果与 getArrayResult()
相同,而不是 PDO 语句。
有什么想法吗?
您可以从查询结果中提取值以获得所需的数组:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getScalarResult();
$country_codes = array();
foreach($query as $result){
$country_codes[] = $result['country'];
}
如果您想要自然的结果,您可以自定义保湿模式,as explained in Doctrine doc。
创建一个 class 扩展 AbstractHydrator:
namespace MyProject\Hydrators;
use Doctrine\ORM\Internal\Hydration\AbstractHydrator;
class ColumnHydrator extends AbstractHydrator
{
protected function _hydrateAll()
{
return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
}
}
将 class 添加到 ORM 配置中:
$em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', 'MyProject\Hydrators\ColumnHydrator');
然后使用它:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery();
$results = $query->getResult('ColumnHydrator');
您好,这种可能性已添加到 Doctrine ORM 2.10+ 中,您现在可以这样做(按照您的示例):
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery()
->getSingleColumnResult();
参考资料:
我有以下代码:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery();
我想获得类似 [ 'EN', 'FR', 'US' ]
的东西,就像 PDO::FETCH_COLUMN
会 return 一样。我尝试了 getScalarResult()
,但 return 的结果与 getArrayResult()
:
array (size=2)
0 =>
array (size=1)
'country' => string 'DE' (length=2)
1 =>
array (size=1)
'country' => string 'MM' (length=2)
我尝试使用 execute()
,正如我在一些示例中看到的那样,但它 return 的结果与 getArrayResult()
相同,而不是 PDO 语句。
有什么想法吗?
您可以从查询结果中提取值以获得所需的数组:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getScalarResult();
$country_codes = array();
foreach($query as $result){
$country_codes[] = $result['country'];
}
如果您想要自然的结果,您可以自定义保湿模式,as explained in Doctrine doc。
创建一个 class 扩展 AbstractHydrator:
namespace MyProject\Hydrators;
use Doctrine\ORM\Internal\Hydration\AbstractHydrator;
class ColumnHydrator extends AbstractHydrator
{
protected function _hydrateAll()
{
return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
}
}
将 class 添加到 ORM 配置中:
$em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', 'MyProject\Hydrators\ColumnHydrator');
然后使用它:
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery();
$results = $query->getResult('ColumnHydrator');
您好,这种可能性已添加到 Doctrine ORM 2.10+ 中,您现在可以这样做(按照您的示例):
$repository = $this->entitymanager->getRepository('Intlist\Entity\Location');
$query = $repository->createQueryBuilder('l')
->select('l.country')
->groupBy('l.country')
->where('l.country != :empty_country')
->setParameter('empty_country', "")
->getQuery()
->getSingleColumnResult();
参考资料: