2013-02-26 21 views
38

Questa è la mia funzione in cui sto cercando di mostrare la cronologia utente. Per questo ho bisogno di visualizzare i crediti correnti dell'utente insieme alla sua storia di credito.Come fare il join sinistro in Doctrine?

questo è quello che sto cercando di fare:

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; 
} 

Tuttavia, ottengo questo errore:

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

Edit: ho sostituito 'ON' con 'CON' nel join clausola e ora quello che vedo è solo 1 valore dalla colonna unita.

risposta

80

Se si dispone di un'associazione su una proprietà che punta per l'utente (diciamo Credit\Entity\UserCreditHistory#user, prese dal vostro esempio), quindi la sintassi è molto semplice:

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(); 
} 

Dal momento che si sta applicando una condizione per l'unita risultato qui, utilizzando un LEFT JOIN o semplicemente JOIN è lo stesso.

Se nessuna associazione è disponibile, allora l'interrogazione si presenta come segue

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(); 
} 

Questo produrrà un gruppo di risultati che appare come segue:

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

Ho appena provato entrambi gli approcci con/senza relazione. , 1 ° per relazione come suggerisci di aver seguito il tuo codice, sto ricevendo il set di risultati. Ma non riesco a vedere il set di risultati aggiunti. per il secondo approccio voglio dire che sto ricevendo dati ma non era quello che stavo cercando esattamente –

+4

La prima query ti dà l'oggetto 'UserCreditHistory' con l'oggetto' Utente' idratato in esso, dal momento che è un fetch- unisciti (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#joins) – Ocramius

+0

Sì vero, è idratato quindi ho bisogno di loop through per ottenere il valore desiderato –

Problemi correlati