我目前正在编写新闻通讯系统。为了发送邮件,我需要从数据库中获取所有电子邮件地址(当然)。
因此,我创建了一个自定义存储库方法,如下所示:
public function getEmailAddresses()
{
$query = $this->getEntityManager()->createQueryBuilder()
->select('u.email')
->from('AppBundle:User', 'u')
->where('u.isNewsletterSubscriber = true')
;
$results = $query->getQuery()->getResult();
$addresses = [];
foreach($results as $line) {
$addresses[] = $line['email'];
}
return $addresses;
}
我想知道是否有比处理结果更好的方法来获得仅包含电子邮件地址的“普通”数组。实际上,在$query->getQuery()->getResult()
之后,我得到的是这样的东西:
'results' =>
[0] => array('email' => '[email protected]')
[1] => array('email' => '[email protected]')
正如我所说,我想要这样的东西:
array('[email protected]', '[email protected]')
使用Doctrine2内置方法是否存在更干净的方法?我尝试了不同的保湿模式,但没有任何效果。
提前感谢:)
您可能会create a custom hydrator,但是按照您现在的方式进行操作确实没有问题。您也可以通过以下方式进行操作:
return array_map('current', $addresses);
return array_column($addresses, 'email');
array_column
函数是PHP 5.5.0引入的,它可以满足您的需求。 array_map
函数将否则工作,调用PHP的内部current
函数,该函数仅返回当前元素的值(始终将其初始化为该数组的第一个元素)。
如果返回大量行,请谨慎使用array_map
,因为它可能会更慢,并且由于必须复制数组,因此肯定会占用更多的内存。
您可以运行带有学说的纯SQL(DBAL):
示例:
public function getEmails()
{
$connection = $this->getEntityManager()->getConnection()->prepare('SELECT u.email FROM user AS u');
$connection->execute();
return $connection->fetchAll(\PDO::FETCH_COLUMN);
}
尝试其他$ hydrationModes,也许有帮助
getResult(混合$ hydrationMode = Doctrine \ ORM \ AbstractQuery :: HYDRATE_OBJECT)
我宁愿使用getArrayResult
方法,所以该学说不能水合每个对象(这是该学说的昂贵任务)。
public function getEmailAddresses()
{
$q = $this->getEntityManager()->createQuery('SELECT u.email FROM AppBundle:User u WHERE u.isNewsletterSubscriber = true');
return array_map('current', $q->getArrayResult());
}