在我的存储库中,我有以下方法:
/**
* 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进行批处理的过程中)。
答案 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;
}
如您所见:
您通过$em->getConfiguration()->addCustomHydrationMode('ColumnHydrator', ColumnHydrator::class);
不是使用getScalarResult
来获取结果,而是使用简单的getResult
来获取结果,并将自定义Hydrator作为参数传递。