教义格式结果为字符串数组

Doctrine Format result to a Array Of strings

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

  /**
  * 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"],["name"=>"contact@papaioannou.com"]]

所以一个简单的方法是用循环迭代结果并展开它:

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

但对我来说似乎效率低下。有没有一种方法可以在不需要循环的情况下按照获取的方式格式化返回的查询数据?

我问的原因是因为结果集可能会变得相当大并且遍历大数组似乎有点慢(例如在使用 symfony 命令通过 cli 的批处理过程中)。

您应该创建自己的 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。