2012-11-28 3 views
5

Prima darò un esempio con qualche pseudo codice e poi spiegherò qual è il problema. Lasciatemi dire che ho due entità User e Phonenumber. La loro relazione è uno-a-molti. Nel mio UserRepository posso avere qualcosa di simile:Doctrine fetch join

class UserRepository 
{ 
    public function getUser($id, $type) 
    { 
     $users = $this->createQuery("SELECT u, p FROM User u JOIN u.phonenumbers p 
      WHERE u.id = :id AND p.type = :type") 
      ->setParameters(array(
       'id' => $id, 
       'type' => $type, 
      )) 
      ->getResult(); 
     return $users[0]; 
    } 
} 

Nella mia app, se ho qualcosa di simile:

$user = $userRepo->getUser(1, 'home'); 
var_dump($user->getPhonenumbers()); // here phonenumbers collection is ok 

$user = $userRepo->getUser(1, 'work'); 
var_dump($user->getPhonenumbers()); // Here phonenumbers collection is wrong. 
           // It's exactly the same as the previous one. 

Così le mie domande è: E 'possibile utilizzare prendere unirsi (con criteri differenti) e ottenere ogni volta la collezione corretta?

risposta

3

L'acquisizione e il filtraggio di una raccolta non sono cose che funzionano abbastanza bene insieme. Ecco come si dovrebbe fare:

SELECT 
    u, p 
FROM 
    User u 
JOIN 
    u.phonenumbers p 
JOIN 
    u.phonenumbers p2 
WHERE 
    u.id = :id 
    AND 
    p2.type = :type 

Questo applica il filtro sul secondo uniti (e non idratata) p2, che si traduce in corretta idratazione e filtraggio.

+0

Per il momento finisco con l'uso di Query :: HINT_REFRESH, che credo avrà un impatto sulle prestazioni, ma sicuramente controllerò la soluzione. Grazie per il tuo tempo. – ventsislaf

-2

Utilizzare querybuilder, è molto più semplice.

public function getUser($id, $type) 
{ 
    return $this->createQueryBuilder("u") 
     ->leftJoin("u.Phonenumbers", "p", "WITH", "p.type=:type") 
     ->where("u.id=:id") 
     ->setParameters(.....) 
     ->getQuery() 
     ->getOneOrNullResult() ; 
} 
+0

L'esempio è solo uno pseudo codice. Il problema è nel comportamento della dottrina, non nel codice fornito. – ventsislaf

+0

Sempre lo stesso, usa leftJoin e WITH statement indipendentemente dal modo in cui crei le query. – Zeljko

+0

L'esempio non è corretto. – Ocramius