Как получить одномерный скалярный массив в результате запроса doctrine dql?
Я хочу получить массив значений из столбца id таблицы аукционов.
Если бы это был сырой SQL, я бы написал:
SELECT id FROM auction
но когда я делаю это в учении и выполнять:
$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
Я получаю такой массив:
array(
array('id' => 1),
array('id' => 2),
)
вместо этого, я хотел бы получить массив, как это:
array(
1,
2
)
как я могу сделать это с помощью доктрины?
5 ответов:
PHP
можно использовать
array_map, и так как у вас есть только элемент на массив, вы можете элегантно использовать'current'как обратный вызов, вместо того, чтобы писать закрытие.$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); $ids = array_map('current', $result);посмотреть ответ Петра Соботки ниже для получения дополнительной информации об использовании памяти.
PHP > = 5.5
как jcbwlkr ответил ниже рекомендуется использовать
array_column.
начиная с PHP 5.5 вы можете использовать array_column чтобы решить эту
$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); $ids = array_column($result, "id");
лучшее решение-использовать
PDO:FETCH_COLUMN. Для этого вам нужен специальный гидратор://MyProject/Hydrators/ColumnHydrator.php namespace DoctrineExtensions\Hydrators\Mysql; use Doctrine\ORM\Internal\Hydration\AbstractHydrator, PDO; class ColumnHydrator extends AbstractHydrator { protected function hydrateAllData() { return $this->_stmt->fetchAll(PDO::FETCH_COLUMN); } }добавить его в учение:
$em->getConfiguration()->addCustomHydrationMode('COLUMN_HYDRATOR', 'MyProject\Hydrators\ColumnHydrator');и вы можете использовать его как это:
$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");
ответ Аскария элегантный, но остерегайтесь использования памяти!
array_map()создает копию переданного массива и эффективно удваивает использование памяти. Если вы работаете с сотнями тысяч элементов массива, это может стать проблемой. Поскольку PHP 5.4 Call-time pass by reference был удален, поэтому вы не можете сделать// note the ampersand $ids = array_map('current', &$result);В этом случае вы можете пойти с явными
$ids = array(); foreach($result as $item) { $ids[] = $item['id']; }
Я думаю, что это невозможно в теории. Просто преобразуйте результирующий массив в структуру данных, которую вы хотите использовать PHP:
$transform = function($item) { return $item['id']; }; $result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
Comments