41 Stimmen

Wie man eine Sammlung in den Abfrageergebnissen von Doctrine2 erhält

Ich versuche, eine Abfrage mit doctrine2 auszuführen, und muss ein Auflistungsobjekt zurückgeben.

Vereinfachtes Snippet:

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

Das zurückgegebene Objekt ist ein Array von Player.

Die Informationen über Abfrageergebnisformate sagt:

Das Ergebnis ist entweder eine einfache Sammlung von Objekten (pure) oder ein Array, in dem die Objekte in den Ergebniszeilen verschachtelt sind (mixed).

Wovon hängt der Ergebnistyp ab und wie kann ich ein Sammelobjekt erhalten?

77voto

chriswoodford Punkte 1163

En getResult() gibt immer ein Array zurück. Wenn Sie eine Sammlung wünschen, müssen Sie das Array übergeben, das von getResult() zu Doctrines ArrayCollection

z.B..

use Doctrine\Common\Collections\ArrayCollection;

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

$players = new ArrayCollection($result);

1voto

cantera Punkte 23391

Da Sie nur "p"-Objekte auswählen (und keine einzelnen Spalten- oder Aggregatwerte) und Sie getResult() für den Hydrationsmodus verwenden, sollte Ihre Abfrage reine Objekte und kein Array zurückgeben.

Ich vermute, dass das Problem mit der Kurzschriftsyntax zusammenhängt, die Sie zum Erstellen der Abfrage verwenden. Als erstes würde ich versuchen, die Abfrage in "Langform" wie folgt zu schreiben:

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

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

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

Ich hätte vermutet, dass Ihre Kurzschrift-Ansatz wäre in Ordnung, aber ich habe gefunden, Doctrine zu Art von pingelig, wenn es darum geht, Methode Verkettung sein.

Je nachdem, wie vereinfacht Ihr Snippet ist, gibt es noch ein paar andere Dinge zu beachten. Meiner Erfahrung nach gibt die gezeigte Abfrage jedoch Player-Objekte zurück.

-1voto

ismaail E.G. Punkte 419

Um ein Objekt anstelle eines Arrays zurückzugeben, müssen Sie "Partial Objects" verwenden.

Hier ein Beispiel für getesteten Code https://stackoverflow.com/a/12044461/1178870

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X