2012-11-28 10 views
5

Zuerst werde ich ein Beispiel mit etwas Pseudo-Code geben und dann werde ich erklären, was das Problem ist. Lassen Sie mich sagen, ich habe zwei Entitäten User und Phonenumber. Ihre Beziehung ist Eins-zu-Viele. In meinem UserRepository kann ich so etwas haben:Doctrine fetch beitreten

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

In meiner app, wenn ich etwas wie:

$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. 

So ist meine Fragen: Ist es möglich, beitreten zu verwenden holen (mit unterschiedlichen Kriterien) und um jedes Mal die richtige Sammlung zu bekommen?

Antwort

3

Fetch Beitritt und Filterung einer Sammlung sind keine Dinge, die ziemlich gut zusammenarbeiten. Hier ist, wie Sie es tun sollten:

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

Dies gilt Filterung auf dem zweiten verbunden (und nicht hydriertem) p2, die in der richtigen Feuchtigkeit und Filterung führt.

+0

Im Moment benutze ich Query :: HINT_REFRESH, was meiner Meinung nach einen gewissen Einfluss auf die Performance haben wird, aber ich werde definitiv Ihre Lösung überprüfen. Vielen Dank für Ihre Zeit. – ventsislaf

-2

Verwenden Sie querybuilder, es ist viel einfacher.

+0

Das Beispiel ist nur ein Pseudo-Code. Das Problem liegt im Verhalten der Doktrin, nicht im bereitgestellten Code. – ventsislaf

+0

Immer noch das gleiche, verwenden Sie links und WITH-Anweisung, egal wie Sie Abfragen erstellen. – Zeljko

+0

Beispiel ist falsch. – Ocramius