【问题标题】:How to fetch values likes PDO::FETCH_COLUMN in Doctrine?如何在 Doctrine 中获取诸如 PDO::FETCH_COLUMN 之类的值?
【发布时间】:2015-01-07 15:30:06
【问题描述】:

我有以下代码:

$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 会返回一样。我试过getScalarResult(),但它返回的结果与getArrayResult()相同:

array (size=2)
  0 => 
    array (size=1)
      'country' => string 'DE' (length=2)
  1 => 
    array (size=1)
      'country' => string 'MM' (length=2)

我尝试使用 execute(),正如我在一些示例中看到的那样,但它返回的结果与 getArrayResult() 相同,而不是 PDO 语句。

有什么想法吗?

【问题讨论】:

    标签: pdo doctrine-orm


    【解决方案1】:

    您好,您现在可以在 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();
    

    参考资料:

    【讨论】:

      【解决方案2】:

      您可以从查询结果中提取值以获得您想要的数组:

      $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

      创建一个扩展 AbstractHydrator 的类:

      namespace MyProject\Hydrators;
      
      use Doctrine\ORM\Internal\Hydration\AbstractHydrator;
      
      class ColumnHydrator extends AbstractHydrator
      {
          protected function _hydrateAll()
          {
              return $this->_stmt->fetchAll(PDO::FETCH_COLUMN);
          }
      }
      

      将类添加到 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');
      

      【讨论】:

      • 对不起,我应该说我正在寻找一个原生函数,比如PDO::fetchAll()\PDO::FETCH_COLUMN,我不想解析结果。
      • @olvlvl 你有时间看看我的编辑吗?
      • 谢谢@Veve,看起来不错。太糟糕了,这款保湿霜没有包含 Doctrine。
      猜你喜欢
      • 1970-01-01
      • 2012-12-30
      • 2014-09-16
      • 2021-08-20
      • 2013-03-22
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多