2013-07-02 8 views
23

Ich bin neu mit Symfony2 und ich baute erfolgreich meine erste Verbindung durch QueryBuilder und Doctrine 2. Wahrscheinlich ist dies eine dumme Frage, aber sowohl online und in den Symfony2 Methoden konnte ich nicht Finde alles, um den Unterschied zwischen den Join-Klauseln "WITH" und "ON" zu verstehen.Symfony2 QueryBuilder beitreten ON und MIT Unterschied

Zum Beispiel ist dies mein Code beitreten:

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

Es funktioniert gut, aber wenn ich ON statt WITH habe ich die folgende Fehlermeldung erhalten:

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

Warum? Ich habe unter den Objekten gesehen, dass es sowohl die T_ON- als auch die T_WITH-Like-Join-Klauseln gibt, aber was ist der Unterschied ihrer Verwendung? Wie sind ihre Anwendungen?

Antwort

41

@florian sind Sie auf die richtige Antwort, aber lassen Sie mich versuchen, es auf Beispiel zu erklären:

in SQL, werden so erstellt Joins:

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

(oder so ähnlich)

nun in Lehre, brauchen Sie nicht ON Klausel zu verwenden, weil Lehre, dass f weiß Aus Beziehungsanmerkungen in Ihren Entitäten. So über Beispiel wäre:

Beide würden alle Kategorien holen und Produkte verbinden, die mit ihnen verbunden sind.

Jetzt kommt die WITH Klausel. Wenn Sie nur Produkte mit Preis größer als 50 anschließen möchten, müssen Sie dies in SQL tun:

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

In Lehre:

// 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() ; 
} 

in Wirklichkeit Also, sollten Sie nie, nie ON verwenden, wenn Sie benutze Lehre. Wenn Sie so etwas brauchen, können Sie fast sicher sein, dass Sie etwas anderes verschraubt haben.

+0

und was ist mit dem Ergebnis? Gibt es assoziierte Entität \ Modell zurück? zum Beispiel kann ich nicht richtig bekommen http://stackoverflow.com/questions/20134014/symfony2-doctrine2-left-join-dql-and-its-result – user1954544

6

Theoretisch erlaubt ON Ihnen, die vollständigen Beitrittskriterien zu geben, während WITH erlaubt, zusätzliche Kriterien zu den Standard-Kriterien hinzuzufügen (IMHO).

Aber was DQL erlaubt ist, die JOIN Kriterien zu vermeiden geben:

Sie müssen nur sagen: $qb->leftJoin('prod.pdata', 'pdata');

Und Doctrine2 wird die korrekt verbinden behandeln.

Hier ist eine ähnliche Frage zu, dass: Can I use "ON" keyword in DQL or do I need to use Native Query?

+0

Vielen Dank für den Kommentar. Ich habe diesen Post schon gesehen und mein Problem ist, dass es meine Frage nicht befriedigt, weil dort nur die Lösung geschrieben ist, aber nicht der Grund für das "WITH" anstelle von "OR" und deren Unterschiede. –