2012-03-29 11 views
6

Próbuję dowiedzieć się, jak wykonać zapytanie wiele do wielu w Doctrine 2 i nie mogę znaleźć odpowiedzi. Wiem dokładnie, jak zrobiłbym to w prostym SQL:Zapytanie wielu do wielu w Doctrine 2

 SELECT ma.id, 
      ma.name 
     FROM user u 
     JOIN user_media_area uma ON uma.user_id = u.id 
     JOIN media_area ma ON uma.media_area_id = ma.id 

Jak zrobić to samo z Doctrine?

+2

Dlaczego to pytanie jest odrzucone? –

Odpowiedz

5

Instrukcja ma kilka dobrych przykładów: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/query-builder.html

w Twoim przypadku będzie to wyglądać mniej więcej tak:

// Build query 
    $em = $this->getEntityManager(); 
    $qb = $em->createQueryBuilder(); 

    $qb->addSelect('user'); 
    $qb->addSelect('mediaArea'); 

    $qb->from('SomeBundle:User','user'); 

    $qb->leftJoin('user.userMediaArea','userMediaArea'); 
    $qb->leftJoin('userMediaArea.mediaArea','mediaArea'); 

    $query = $qb->getQuery(); 
    $users = $query->getResult(); 
    echo $users[0]->getUserMediaArea()->getName(); 

Nie opublikować swój kod jednostki, więc musiałem zrobić trochę zgadywać, w jaki sposób zdefiniowano relacje. Jeśli masz zwykłą ManyToMany między użytkownikiem a MediaArea, możesz pominąć dołączenie UserMediaArea. D2 to rozgryzie. A ponieważ naprawdę potrzebujesz tylko informacji MediaArea, odwrócę zapytanie i wybiorę z MediaArea, więc informacja o użytkowniku nie musi być zwrócona. Ale próbowałem wykonać twoje pierwotne zapytanie.

+0

Dzięki! To się udało. (W pewnym momencie edytowałem twój oryginalny kod, ale w momencie tego komentarza edytowanie nie zostało jeszcze sprawdzone przez recenzentów.) Dziękuję szczególnie za to, że właściwie zrozumiałem moje pytanie i używając nazw moich jednostek w odpowiedzi. –

+0

@Cerad masz pomysł, jak to zrobić w natywnym sql z mapowaniem zestawu wyników. – hardik

+0

Niestety nie. W kilku przypadkach, w których musiałem używać sql (ze względu na wydajność), sam wykonuję mapowania. – Cerad

-1
SELECT ma.id, ma.name 
FROM User u 
JOIN u.media 

Użytkownik jest jednostką Użytkownik, a u.media jest jednostką Media.

+1

Dzięki za odpowiedź. A co z częścią PHP? Jak to pójdzie? –

+0

$ sql = 'WYBIERZ ma.id, ma.name od użytkownika u JOIN u.media'; \t $ result = $ entityManager-> createQuery ($ sql) -> getResult(); –

+0

Nie próbowałem tego. Po bliższym przyjrzeniu się, twój DQL nawet nie odnosi się do mojej tabeli sprzężenia. Skąd miałaby pochodzić twoja "ma"? Ponadto nie mam nic zwanego "mediami". Nie jestem pewien, czy przeczytałeś moje pytanie, czy też skorygowałeś swoją odpowiedź zbyt uważnie. –

Powiązane problemy