2013-07-02 12 views
23

Jestem nowy z Symfony2 i pomyślnie zbudowałem moje pierwsze dołączenie przez QueryBuilder i Doctrine 2. To chyba głupie pytanie, ale zarówno w trybie on-line, jak i w metodach Symfony2, nie byłem w stanie znajdź wszystko, by zrozumieć różnicę między klauzulami złączeń "Z" i "WŁĄCZONY".Symfony2 QueryBuilder dołącz do ON i Z INNĄ różnicą

Na przykład to moja dołączyć kod:

->leftJoin('EcommerceProductBundle:ProductData', 'pdata', 'WITH', 'prod.id = IDENTITY(pdata.product)') 

To działa dobrze, ale jeśli mogę umieścić ON zamiast WITH pojawia się następujący błąd:

[Syntax Error] line 0, col 200: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'

Dlaczego? Widziałem wśród obiektów, że istnieją zarówno T_ON i T_WITH jak klauzule przyłączyć, ale jaka jest ich różnica użytkowania? Jakie są ich zastosowania?

Odpowiedz

41

@florian dał ci poprawną odpowiedź, ale pozwól mi spróbować wyjaśnić to na przykładzie:

w SQL, łączy są zrobione tak:

SELECT * FROM category 
    LEFT JOIN product ON product.category_id = category.id 

(lub coś takiego)

teraz w doktrynie, nie trzeba używać ON klauzuli ponieważ doktryna wie, że f adnotacje relacji rom w twoich jednostkach. Tak więc powyższy przykład będzie następujący:

// CategoryRepository.php 
public function getCategoriesAndJoinProducts() 
{ 
    return $this->createQueryBuilder("o") 
     ->leftJoin("o.products", "p")->addSelect("p") 
     ->getQuery()->getResult() ; 
} 

Obie będą pobierać wszystkie kategorie i dołączać do powiązanych z nimi produktów.

Teraz przychodzi klauzula WITH. Jeśli chcesz dołączyć tylko produkty o cenie większej niż 50, należy to zrobić w SQL:

SELECT * FROM category 
    LEFT JOIN product ON product.category_id = category.id AND product.price>50 

W Naukach:

// CategoryRepository.php 
public function getCategoriesAndJoinProductsWithPriceBiggerThan($price) 
{ 
    return $this->createQueryBuilder("o") 
     ->leftJoin("o.products", "p", "WITH", "p.price>:price") 
      ->setParameter("price", price)->addSelect("p") 
     ->getQuery()->getResult() ; 
} 

Tak więc, w rzeczywistości należy nigdy, nigdy, jeśli używasz ON używają Doctrine. Jeśli potrzebujesz czegoś takiego, możesz być prawie pewna, że ​​skręciłeś coś innego.

+0

a co z wynikiem? czy to zwraca jednostkę stowarzyszoną \ model? na przykład nie mogę uzyskać właściwego http://stackoverflow.com/questions/20134014/symfony2-doctrine2-left-join-dql-and-its-result – user1954544

6

Teoretycznie ustawienie WŁĄCZENIA umożliwia podanie pełnych kryteriów łączenia, natomiast Z uprawnieniami umożliwia dodawanie dodatkowych kryteriów do domyślnych (IMHO).

Ale co DQL zezwolenia jest uniknięcie dając charakterystyczne społeczności:

Po prostu trzeba powiedzieć: $qb->leftJoin('prod.pdata', 'pdata');

I doctrine2 zajmie się przyłączyć poprawnie.

Oto powiązany pytanie o to: Can I use "ON" keyword in DQL or do I need to use Native Query?

+0

Wielkie dzięki za komentarz. Widziałem już ten post, a moim problemem jest to, że nie spełnia on mojego pytania, ponieważ tam jest napisane tylko rozwiązanie, ale nie powód "Z" zamiast "LUB" i ich różnice. –

Powiązane problemy