从 Doctrine2 获取值数组的正确方法
Proper way to get an array of values from Doctrine2
我目前正在编写一个时事通讯系统。为了发送邮件,我需要从我的数据库中获取所有电子邮件地址(当然)。
所以我创建了一个自定义存储库方法,如下:
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;
}
我想知道是否有比处理结果以获得仅包含电子邮件地址的 "plain" 数组更好的方法。实际上,在 $query->getQuery()->getResult()
之后,我得到这样的结果:
'results' =>
[0] => array('email' => 'first@email.com')
[1] => array('email' => 'second@email.com')
正如我所说,我想要这样的东西:
array('first@email.com', 'second@email.com')
是否存在使用 Doctrine2 内置方法的更简洁的方法?我试过不同的保湿模式,但没有任何效果。
提前致谢:)
你可能 create a custom hydrator,但按照你现在的方式去做真的没有问题。您也可以通过以下方式进行:
PHP <= 5.4
return array_map('current', $addresses);
PHP >= 5.5
return array_column($addresses, 'email');
array_column
函数是在 PHP 5.5.0 中引入的,可以满足您的需求。 array_map
函数将以其他方式工作,调用 PHP 的内部 current
函数,它只是 returns 当前元素的值(它总是被初始化为第一个元素数组).
如果返回的行数很多,请小心使用 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());
}
我目前正在编写一个时事通讯系统。为了发送邮件,我需要从我的数据库中获取所有电子邮件地址(当然)。
所以我创建了一个自定义存储库方法,如下:
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;
}
我想知道是否有比处理结果以获得仅包含电子邮件地址的 "plain" 数组更好的方法。实际上,在 $query->getQuery()->getResult()
之后,我得到这样的结果:
'results' =>
[0] => array('email' => 'first@email.com')
[1] => array('email' => 'second@email.com')
正如我所说,我想要这样的东西:
array('first@email.com', 'second@email.com')
是否存在使用 Doctrine2 内置方法的更简洁的方法?我试过不同的保湿模式,但没有任何效果。
提前致谢:)
你可能 create a custom hydrator,但按照你现在的方式去做真的没有问题。您也可以通过以下方式进行:
PHP <= 5.4
return array_map('current', $addresses);
PHP >= 5.5
return array_column($addresses, 'email');
array_column
函数是在 PHP 5.5.0 中引入的,可以满足您的需求。 array_map
函数将以其他方式工作,调用 PHP 的内部 current
函数,它只是 returns 当前元素的值(它总是被初始化为第一个元素数组).
如果返回的行数很多,请小心使用 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());
}