web-dev-qa-db-fra.com

Comment obtenir une collection dans les résultats de requête de Doctrine2

J'essaie d'exécuter une requête à l'aide de doctrine2 et j'en ai besoin pour retourner un objet de collection.

Extrait simplifié:

$players = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

L'objet retourné est un tableau de Player.

Les informations sur formats de résultats de requête indiquent:

Le résultat est soit une simple collection d'objets (pure) ou un tableau où les objets sont imbriqués dans les lignes de résultat (mixtes).

De quoi dépend le type de résultat et comment puis-je obtenir un objet de collection?

32
mkraemer

getResult () renvoie toujours un tableau. Si vous voulez une collection, vous devez passer le tableau retourné par getResult () à ArrayCollection de Doctrine

par exemple.

use Doctrine\Common\Collections;

$result = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

$players = new Collections\ArrayCollection($result);
60
chriswoodford

pour renvoyer un objet au lieu d'un tableau, vous devez utiliser des "objets partiels".

voici l'exemple de code testé https://stackoverflow.com/a/12044461/117887

1
ismaail E.G.

Étant donné que vous ne sélectionnez que des objets 'p' (et aucune colonne individuelle ni valeur agrégée) et que vous utilisez getResult () pour le mode d'hydratation, votre requête doit renvoyer des objets purs plutôt qu'un tableau.

Ma meilleure supposition est que le problème est lié à la syntaxe raccourcie que vous utilisez pour créer la requête. La première chose que j'essaierais est d'écrire la requête "forme longue" comme ceci:

$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();

$qb->select('p')
   ->from('...\Player', 'p');

$query = $qb->getQuery();
$players = $query->getResult();

J'aurais deviné que votre approche abrégée serait bien, mais j'ai trouvé Doctrine être un peu capricieux en ce qui concerne le chaînage des méthodes.

Il y a quelques autres choses à considérer selon la simplicité de votre extrait de code. Mais d'après mon expérience, la requête écrite comme indiqué renverra des objets Player.

1
cantera