php - resultados - ¿Cómo obtener una matriz escalar unidimensional como un resultado de consulta dql de doctrina?
pasar consulta sql a array php (5)
PHP <5.5
Puede usar array_map
, y como solo tiene el elemento por conjunto, puede usar elegantemente ''current''
como callback, en lugar de escribir un closure .
$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map(''current'', $result);
Consulte la respuesta de Petr Sobotka a continuación para obtener información adicional sobre el uso de la memoria.
PHP> = 5.5
Como jcbwlkr''s respondió a continuación , la forma recomendada de usar array_column
.
Quiero obtener una matriz de valores de la columna de Id. De la tabla Subasta. Si esto fuera un SQL sin formato, escribiría:
SELECT id FROM auction
Pero cuando hago esto en Doctrine y lo ejecuto:
$em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
Obtengo una matriz como esta:
array(
array(''id'' => 1),
array(''id'' => 2),
)
En cambio, me gustaría obtener una matriz como esta:
array(
1,
2
)
¿Cómo puedo hacer eso usando Doctrine?
A partir de PHP 5.5, puedes usar array_column para resolver esto
$result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_column($result, "id");
Creo que es imposible en Doctrine. Simplemente transforma la matriz de resultados en la estructura de datos que deseas usando PHP:
$transform = function($item) {
return $item[''id''];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
La respuesta de Ascarius es elegante, ¡pero ten cuidado con el uso de la memoria! array_map()
crea una copia de la matriz pasada y efectivamente duplica el uso de la memoria. Si trabajas con cientos de miles de elementos de matriz, esto puede convertirse en un problema. Desde que se eliminó el paso de tiempo de llamada PHP 5.4 por referencia, no se puede hacer
// note the ampersand
$ids = array_map(''current'', &$result);
En ese caso, puedes ir con obvio
$ids = array();
foreach($result as $item) {
$ids[] = $item[''id''];
}
Una mejor solución es usar PDO:FETCH_COLUMN
. Para hacerlo, necesitas un hidratador personalizado:
//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);
}
}
Agrégalo a Doctrine:
$em->getConfiguration()->addCustomHydrationMode(''COLUMN_HYDRATOR'', ''MyProject/Hydrators/ColumnHydrator'');
Y puedes usarlo así:
$em->createQuery("SELECT a.id FROM Auction a")->getResult("COLUMN_HYDRATOR");
Más información: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes