2012-11-28 11 views
5

Najpierw podam przykład z pseudo kodem, a następnie wyjaśnię, na czym polega problem. Pozwól mi powiedzieć, że mam dwie jednostki Użytkownik i numer telefonu. Ich relacja jest jeden do wielu. W moim UserRepository mogę mieć coś takiego:Przyłączenie Doctrine

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

w mojej aplikacji, jeśli mam coś takiego:

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

więc moje pytanie brzmi: Czy jest możliwe aby użyć sprowadzić join (z różnymi kryteriami) i za każdym razem uzyskać właściwą kolekcję?

Odpowiedz

3

Pobierz łączenie i filtrowanie kolekcji nie są rzeczy, które działają ze sobą całkiem dobrze. Oto, jak należy to zrobić:

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

Dotyczy to filtrowanie na drugi dołączył (a nie nawodniony) p2, co skutkuje prawidłowego nawodnienia i filtrowanie.

+0

Na razie kończę używać Query :: HINT_REFRESH, co, jak sądzę, będzie miało pewien wpływ na wydajność, ale na pewno sprawdzę twoje rozwiązanie. Dziękuję za Twój czas. – ventsislaf

-2

Użyj querybuilder, to jest znacznie prostsze.

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

Przykład to tylko pseudo kod. Problem leży w zachowaniu doktryny, a nie w dostarczonym kodzie. – ventsislaf

+0

Wciąż to samo, użyj instrukcji leftJoin i WITH, niezależnie od tego, jak budujesz zapytania. – Zeljko

+0

Przykład jest niepoprawny. – Ocramius