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

the*_*bry 2 php symfony doctrine-orm

我正在编写新闻通讯系统.为了发送邮件,我需要从我的数据库中获取所有电子邮件地址(当然).

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来处理结果,以获得只包含电子邮件地址的"普通"数组.实际上,之后$query->getQuery()->getResult(),我得到这样的东西:

'results' =>
 [0] => array('email' => 'first@email.com')
 [1] => array('email' => 'second@email.com')
Run Code Online (Sandbox Code Playgroud)

正如我所说,我想要这样的事情:

array('first@email.com', 'second@email.com')
Run Code Online (Sandbox Code Playgroud)

使用Doctrine2内置方法是否存在更清晰的方法?我尝试过不同的水合模式,但没有任何效果.

提前致谢 :)

Jas*_*man 6

你可能可以创建一个定制的保湿器,但是就像你现在的方式一样,真的没有问题.您也可以通过以下方式执行此操作:

PHP <= 5.4

return array_map('current', $addresses);
Run Code Online (Sandbox Code Playgroud)

PHP> = 5.5

return array_column($addresses, 'email');
Run Code Online (Sandbox Code Playgroud)

array_column功能是在PHP 5.5.0中引入的,可以满足您的需求.该array_map函数将起作用,调用PHP的内部current函数,它只返回当前元素的值(它始终初始化为该数组的第一个元素).

array_map如果你有大量的行返回,请小心使用,因为它可能会更慢,它肯定会占用更多的内存,因为它必须复制数组.