2013-02-26 9 views
38

Dies ist meine Funktion, wo ich versuche, den Benutzerverlauf zu zeigen. Dazu muss ich die aktuellen Credits des Benutzers zusammen mit seiner Kredithistorie anzeigen.Wie geht man links in Doctrine beizutreten?

Das ist, was ich versuche zu tun:

public function getHistory($users) { 
    $qb = $this->entityManager->createQueryBuilder(); 
    $qb->select(array('a','u')) 
      ->from('Credit\Entity\UserCreditHistory', 'a') 
      ->leftJoin('User\Entity\User', 'u', \Doctrine\ORM\Query\Expr\Join::WITH, 'a.user = u.id') 
      ->where("a.user = $users ") 
      ->orderBy('a.created_at', 'DESC'); 

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

    return $results; 
} 

Allerdings bekomme ich diesen Fehler:

[Syntax Error] line 0, col 98: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'

bearbeiten: die I ersetzt 'ON' mit 'WITH' mitmachen Klausel und jetzt, was ich sehe, ist nur 1 Wert aus der verbundenen Spalte.

Antwort

80

Wenn Sie eine Verbindung auf einem Grundstück haben den Benutzer zeigen (sie Credit\Entity\UserCreditHistory#user sagt, nahm aus Ihrem Beispiel), dann ist die Syntax recht einfach:

public function getHistory($users) { 
    $qb = $this->entityManager->createQueryBuilder(); 
    $qb 
     ->select('a', 'u') 
     ->from('Credit\Entity\UserCreditHistory', 'a') 
     ->leftJoin('a.user', 'u') 
     ->where('u = :user') 
     ->setParameter('user', $users) 
     ->orderBy('a.created_at', 'DESC'); 

    return $qb->getQuery()->getResult(); 
} 

Da Sie eine Bedingung auf dem verbunden sind, die Anwendung Ergebnis hier, mit einem LEFT JOIN oder einfach JOIN ist das gleiche.

Wenn keine Verbindung zur Verfügung steht, dann sieht die Abfrage wie

folgende
public function getHistory($users) { 
    $qb = $this->entityManager->createQueryBuilder(); 
    $qb 
     ->select('a', 'u') 
     ->from('Credit\Entity\UserCreditHistory', 'a') 
     ->leftJoin(
      'User\Entity\User', 
      'u', 
      \Doctrine\ORM\Query\Expr\Join::WITH, 
      'a.user = u.id' 
     ) 
     ->where('u = :user') 
     ->setParameter('user', $users) 
     ->orderBy('a.created_at', 'DESC'); 

    return $qb->getQuery()->getResult(); 
} 

Dies wird eine resultset produzieren, das wie folgt aussieht:

array(
    array(
     0 => UserCreditHistory instance, 
     1 => Userinstance, 
    ), 
    array(
     0 => UserCreditHistory instance, 
     1 => Userinstance, 
    ), 
    // ... 
) 
+0

i beide gerade versucht, nähert sich mit/ohne Beziehung. , 1. für mit Beziehung, wie Sie vorschlagen, dass ich Ihrem Code folgte, bekomme ich die Ergebnismenge. Aber ich kann den Joined-Ergebnissatz nicht sehen. für den zweiten Ansatz möchte ich sagen, dass ich Daten bekomme, aber es war nicht, was ich genau gesucht habe –

+4

Die erste Abfrage gibt Ihnen das 'UserCreditHistory' Objekt mit dem' User' Objekt hydratisiert, da es ein Abruf- ist beitreten (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#joins) – Ocramius

+0

Yup sehr wahr, es ist hydratisiert, also muss ich Schleife durch, um den gewünschten Wert zu erhalten –

Verwandte Themen