主义将结果格式化为字符串数组

时间:2018-10-07 17:41:11

标签: php doctrine-orm doctrine-query

在我的存储库中,我有以下方法:

  /**
  * List and Seatch for existing emails
  * @param Integer $page The pagination page
  * @param Integet $limit The page limit
  * @return String[]
  */
  public function getEmailListInOrderToSendEmail()
  {
    $em=$this->getEntityManager();

    $queryBuilder = $em->createQueryBuilder();
    $queryBuilder->select('c.email')->from(ContactEmail::class,'c');

    $value=$queryBuilder->getQuery()->getScalarResult();

    if(empty($value)){
      return [];
    }

    return $value;
  }

我要返回的返回类型的自定义示例如下:

  

[“ ddesyllas@gmail.com”,“ contact@papaioannou.com”]

但是返回以下结果:

  

[[''email'=>“ ddesyllas@gmail.com”],[“名称” =>“ contact@papaioannou.com”]]

因此,一种幼稚的方法是使用循环遍历结果并将其展开:

$newResults=[];
foreach($results as $result){
 $newResults[]=$result['email'];
}

但是对我来说似乎效率低下。有没有一种方法可以按获取的方式格式化返回的查询数据,而无需执行循环?

我问的原因是因为结果集可能变得很大,并且在大数组上进行迭代似乎有点慢(例如,在使用symfony命令通过cli进行批处理的过程中)。

1 个答案:

答案 0 :(得分:1)

您应创建自己的Hydrator:

namespace AppBundle\Hydrators;

use Doctrine\ORM\Internal\Hydration\AbstractHydrator;

class ColumnHydrator extends AbstractHydrator
{
    protected function hydrateAllData()
    {
        return $this->_stmt->fetchAll(\PDO::FETCH_COLUMN);
    }
}

当您需要将数据作为数组加载时,将其加载到实体管理器上:

//Namepsace Definitions etc etc
use AppBundle\Hydrators\ColumnHydrator;

//Class definition

 /**
  * List and Search for existing emails
  * @param Integer $page The pagination page
  * @param Integer $limit The page limit
  * @return String[]
  */
  public function getEmailListInOrderToSendEmail()
  {
    $em=$this->getEntityManager();
    $em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', ColumnHydrator::class);

    $queryBuilder = $em->createQueryBuilder();
    $queryBuilder->select('c.email')->from(ContactEmail::class,'c');

    $value=$queryBuilder->getQuery()->getResult('ColumnHydrator');

    if(empty($value)){
      return [];
    }

    return $value;
  }

如您所见:

  1. 您通过$em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', ColumnHydrator::class);

  2. 加载水化器
  3. 不是使用getScalarResult来获取结果,而是使用简单的getResult来获取结果,并将自定义Hydrator作为参数传递。