Php 从Doctrine2获取值数组的正确方法

Php 从Doctrine2获取值数组的正确方法,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我目前正在编写一个通讯系统。为了发送邮件,我需要从数据库中获取所有电子邮件地址(当然) 因此,我创建了一个自定义存储库方法,如下所示: public function getEmailAddresses() { $query = $this->getEntityManager()->createQueryBuilder() ->select('u.email') ->from('AppBundle:User', 'u')

我目前正在编写一个通讯系统。为了发送邮件,我需要从数据库中获取所有电子邮件地址(当然)

因此,我创建了一个自定义存储库方法,如下所示:

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' => 'first@email.com')
 [1] => array('email' => 'second@email.com')
array('first@email.com', 'second@email.com')
正如我所说,我想要这样的东西:

'results' =>
 [0] => array('email' => 'first@email.com')
 [1] => array('email' => 'second@email.com')
array('first@email.com', 'second@email.com')
使用Doctrine2内置方法是否存在一种更干净的方法?我尝试过不同的补水模式,但都没有效果

提前感谢:)

你也许可以,但现在这样做真的没有问题。您也可以通过以下方式进行:

PHP=5.5 PHP5.5.0中引入了
array\u column
函数,它完成了您想要的功能。
array\u map
函数将在其他情况下工作,调用PHP的内部
current
函数,该函数只返回当前元素的值(该元素总是初始化为该数组的第一个元素)


如果返回了大量行,请小心使用
array\u map
,因为它可能会比较慢,而且由于必须复制数组,它肯定会占用更多内存。

您可以使用条令(DBAL)运行纯sql:

例如:

public function getEmails()
{
    $connection = $this->getEntityManager()->getConnection()->prepare('SELECT u.email FROM user AS u');

    $connection->execute();

    return $connection->fetchAll(\PDO::FETCH_COLUMN);
}

试试其他模式,也许会有帮助


getResult(混合$hydrationMode=Doctrine\ORM\AbstractQuery::hydration\u OBJECT)

我更愿意使用
getArrayResult
方法,因此Doctrine不能对每个对象进行水合(这是Doctrine的昂贵任务)


Oops无意中删除了我的评论,但我错了,你是对的——它使用的是运行纯SQL查询的DBAL原则层。唯一的区别是您不能使用ORM使用的对象名引用(如
AppBundle:User
),而必须使用数据库表和列名。@JasonRoman哈哈,我已经编辑了我的答案:),谢谢您提供的有用信息。
public function getEmailAddresses()
{
    $q = $this->getEntityManager()->createQuery('SELECT u.email FROM AppBundle:User u WHERE u.isNewsletterSubscriber = true');

    return array_map('current', $q->getArrayResult());
}