Как получить одномерный скалярный массив в результате запроса 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
)


как я могу сделать это с помощью доктрины?

694   5  

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");

Подробнее: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes

ответ Аскария элегантный, но остерегайтесь использования памяти! 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

    Ничего не найдено.