133 votes

Comment obtenir un tableau scalaire unidimensionnel en tant que résultat d'une requête doctrine dql?

Je souhaite obtenir un tableau de valeurs de la colonne id du tableau Auction. Si c'était un SQL brut, j'écrirais:

 SELECT id FROM auction
 

Mais quand je fais cela dans Doctrine et que j'exécute:

 $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult(); 
 

Je reçois un tableau comme celui-ci:

 array(
    array('id' => 1),
    array('id' => 2),
)
 

Au lieu de cela, je voudrais obtenir un tableau comme celui-ci:

 array(
    1,
    2
)
 

Comment puis-je faire cela en utilisant Doctrine?

209voto

Ascarius Points 893

La fonction $tranform Minras peut être remplacée avec élégance par current

 $result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_map('current', $result);
 

171voto

jacobwalker0814 Points 541

Depuis PHP 5.5, vous pouvez utiliser array_column pour résoudre ce problème.

 $result = $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult();
$ids = array_column($result, "id");
 

18voto

Petr Sobotka Points 101

La réponse d'Ascarius est élégante, mais méfiez-vous de l'utilisation de la mémoire! array_map() crée une copie du tableau transmis et double efficacement l'utilisation de la mémoire. Si vous travaillez avec des centaines de milliers d'éléments de tableau, cela peut devenir un problème. Comme le temps de référence par appel PHP 5.4 a été supprimé, vous ne pouvez plus le faire.

 // note the ampersand
$ids = array_map('current', &$result);
 

Dans ce cas, vous pouvez aller avec évident

 $ids = array();
foreach($result as $item) {
  $ids[] = $item['id'];
}
 

5voto

Minras Points 1403

Je pense que c'est impossible dans Doctrine. Il suffit de transformer le tableau de résultats en structure de données que vous souhaitez utiliser avec PHP:

 $transform = function($item) {
    return $item['id'];
};
$result = array_map($transform, $em->createQuery("SELECT a.id FROM Auction a")->getScalarResult());
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X