2012-06-20 10 views
17

Usiłuję zbudować kwerendę z konstruktora zapytań doktryna, która łączy non powiązanej tabeli tak:Symfony 2: INNER JOIN na brak powiązanej tabeli z konstruktora zapytań doktryna

$query = $this->createQueryBuilder('gpr') 
     ->select('gpr, p') 
     ->innerJoin('TPost', 'p') 
     ->where('gpr.contentId = p.contentId') 

Ale tego nie robi praca. Wciąż pojawia się błąd:

Error: Identification Variable TPost used in join path expression but was not defined before.

szukałem tego komunikatu o błędzie i wszyscy odpowiadali użyć aliasu stół + atrybutów jak p.someAttribute. Ale tabela, do której chcę się przyłączyć, nie jest powiązana z tabelą, od której zaczynam mój wybór.

jako normalny zapytania mysql chciałbym napisać to tak:

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id 

pomysłów, co robię źle?

+0

Możemy użyć DQL wykonać połączenie z niepowiązanymi obiektami? Nie wiem. Jeśli to możliwe, to jest interesujące =). – sensorario

+2

Dlaczego po prostu nie * zbudujesz * relacji między tymi dwoma, jeśli chcesz do nich dołączyć? –

+0

W tym przypadku relacja nie wystarczy. Potrzebowałbym relacji z trzema różnymi tabelami, a każdy rekord mógł ustawić tylko odniesienie do jednego z tych 3. –

Odpowiedz

51

Dzisiaj pracowałem nad podobnym zadaniem i przypomniałem sobie, że otworzyłem ten numer. Nie wiem od kiedy to wersja doktryny działa, ale teraz możesz łatwo dołączyć do klas potomnych w mapowaniu dziedziczenia. Więc zapytanie jak to działa bez problemu:

$query = $this->createQueryBuilder('c') 
     ->select('c') 
     ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id') 
     ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id') 
     ->orderBy('c.createdAt', 'DESC') 
     ->where('co.group = :group OR ct.group = :group') 
     ->setParameter('group', $group) 
     ->setMaxResults(20); 

zacznę zapytania w mojej klasie dominującej, która jest przy użyciu mapowania dziedziczenia. W moim poprzednim poście był to inny punkt wyjścia, ale ten sam problem, jeśli dobrze pamiętam.

Ponieważ był to poważny problem, gdy zaczynałem ten problem, myślę, że może to być interesujące także dla innych osób, które o tym nie wiedzą.

+0

Dziękujemy! To naprawdę pomogło, szukam od wielu godzin. – Assil

+0

jeśli nie mam repozytorium 'MyBundleName: ChildTwo', chcę napisać zapytanie z nazwą tabeli, a następnie jakie jest rozwiązanie.? –

+0

@MohammadFareed Odwołanie do encji nie jest repozytorium, jest to ciąg w postaci ": " LUB FQCN klasy obiektu, np. \ AppBundle \ Entity \ ChildTwo :: class –

0

Łączenie DQL działa tylko wtedy, gdy w twoim mapowaniu zdefiniowano powiązanie. W twoim przypadku powiedziałbym, że o wiele łatwiej jest wykonać natywne zapytanie i użyć ResultSetMapping do zapełnienia twoich obiektów.

2
$dql = "SELECT 
    a, md.fisrtName , md.LastName, mj 
    FROM MembersBundle:Memberdata md 
     INNER JOIN MembersBundle:Address a WITH md = a.empID 
     INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData 
      ... 
    WHERE 
     a.dateOfChange IS NULL 
    AND WHERE 
     md.someField = 'SomeValue'"; 

return $em->createQuery($dql)->getResult(); 
+1

Podczas gdy ta odpowiedź nie dostarcza wymaganych danych, nie ma nic do cytowania, ponieważ dokumentacja Doctrine całkowicie nie uwzględnia tego typu połączeń. To działało dla mnie. Znam wystarczająco dużo SQL, aby przeanalizować, co było zamierzone, a za mało doktryny, aby połączyć kropki. – eggmatters

3

Łączy pomiędzy podmiotami bez skojarzeń nie były możliwe do wersji 2.4, gdzie można wygenerować dowolną przyłączyć o następującej składni:

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email'); 

referencyjny: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

+0

To jest niesamowite!Zauważ, że w tym przypadku wymagana jest klauzula 'WITH', w przeciwnym razie spowoduje błąd składni. Możesz jednak użyć fikcyjnego warunku i zasadniczo uzyskać prawdziwe sprzężenie krzyżowe, którego DQL w żaden sposób nie obsługuje. Na przykład: SELECT u FROM User u JOIN Items i WITH 0 = 0'. Może to być przydatne w przypadku złożonych statystyk. – jlh