2016-05-31 16 views
2

Wenn eine DQL-Abfrage wie ausführen:Lehre DQL Erste Ergebnisse der SQL Weg

SELECT u AS user, t AS transaction 
FROM Model\User u 
JOIN Model\Transaction t WITH t.user = u 

Sie erhalten abwechselnden Reihen der Ergebnisse, wie zum Beispiel:

  • ['user' => Model\User(1)]
  • ['transaction' => Model\Transaction(1)]
  • ['transaction' => Model\Transaction(2)]
  • ['user' => Model\User(2)]
  • ['transaction' => Model\Transaction(3)]
  • ['transaction' => Model\Transaction(4)]
  • ['transaction' => Model\Transaction(5)]

Ist es möglich, das Ergebnis der SQL Art und Weise zu bekommen, wie:

  • ['user' => Model\User(1), 'transaction' => Model\Transaction(1)]
  • ['user' => Model\User(1), 'transaction' => Model\Transaction(2)]
  • ['user' => Model\User(2), 'transaction' => Model\Transaction(3)]
  • ['user' => Model\User(2), 'transaction' => Model\Transaction(4)]
  • ['user' => Model\User(2), 'transaction' => Model\Transaction(5)]

Es wäre viel einfacher, als mit abwechselnden Objekte zu behandeln.

Antwort

0

So wie ich es jetzt tun, ist:

$query = $em->createQuery(' 
    SELECT u, t 
    FROM Model\User u 
    JOIN Model\Transaction t WITH t.user = u 
'); 

$rows = $query->getResult(); 
$rowCount = count($rows); 

$result = []; 

for ($i = 0; $i < $rowCount; $i += 2) { 
    /** @var Model\User $user */ 
    $user = $rows[$i]; 

    /** @var Model\Transaction $transaction */ 
    $transaction = $rows[$i + 1]; 

    $result[] = new UserTransactionDTO($user, $transaction); 
} 

return $result; 

Welche sauber genug ist.

Beachten Sie, dass dieses Beispiel schlecht ist, da Sie nur Transaktionen zurückgeben und den Benutzer von dort abrufen können; aber ich begegne regelmäßig Anwendungsfällen, in denen ein einzelnes Objekt nicht alle Informationen enthält.

0

Leider gibt es keinen Strom einfach Weg dies zu erreichen. Es gibt jedoch eine Möglichkeit, das Ergebnis zu erzielen.

Erstellen Sie eine Klasse namens UserTransactionDTO, und akzeptieren Sie 2 Konstruktorargumente: User und Transaction.

umschreiben Sie nun Ihre DQL Abfrage wie folgt:

SELECT NEW UserTransactionDTO(user, transaction) 
    FROM Model\User u 
    JOIN Model\Transaction t WITH t.user = u 

Dies sollte Ihnen ein Ergebnis geben, die Ihren gewünschten Verhalten entspricht (eine Liste der UserTransactionDTO Objekte), so dass Sie sowohl für Benutzer und Transaktion auf einem einzelnen Datensatz zugreifen .

+0

Danke, ich habe das versucht, aber mein Konstruktor erhält das Objekt IDs, und nicht die Objekte, als Argumente! Vielleicht ist das Schlüsselwort 'NEW' nur für Skalare gedacht? – Benjamin

+1

Von http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax "Beachten Sie, dass Sie nur skalare Ausdrücke übergeben können an den Konstruktor. " – eggmatters

+0

Eine Sache, die ich nicht erwähnt habe, ist, dass ich an Doctrine Projekt arbeite. Dies zu unterstützen ist eine Frage der Öffnung eines Problems. Das Hauptproblem sollte jedoch in Doktrin 3 behandelt werden, da ich gerade daran arbeite. –