In Doctrine können Sie DQL auf zwei Arten erstellen:
EntityManager :: createQuery :
$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1');
QueryBuilder :
$qb->add('select', 'u')
->add('from', 'User u')
->add('where', 'u.id = ?1')
->add('orderBy', 'u.name ASC');
Ich frage mich, was der Unterschied ist und welchen ich verwenden soll.
doctrine-orm
Never_had_a_name
quelle
quelle
Der Abfrage-Generator ist beispielsweise eine Schnittstelle zum Erstellen von Abfragen ... Er sollte komfortabler zu verwenden sein und verfügt nicht nur über die Methode add (), sondern auch über Methoden wie where () und Where (), from () usw. Am Ende wird jedoch nur eine Abfrage erstellt, wie Sie sie in der Methode createQuery () verwenden.
Beispiel für eine erweiterte Verwendung des Abfrage-Generators:
quelle
Sie haben unterschiedliche Zwecke:
quelle
Der Hauptunterschied ist der Aufwand für den Aufruf der Methoden. Ihr erstes Codebeispiel (createQuery) führt der Einfachheit halber einen Methodenaufruf aus, während der queryBuilder 4 ausführt. Am Ende von allem kommt es auf eine Zeichenfolge an, die ausgeführt werden muss. Im ersten Beispiel geben Sie ihm die Zeichenfolge und Das andere erstellen Sie mit mehreren verketteten Methodenaufrufen.
Wenn Sie nach einem Grund suchen, einen über den anderen zu verwenden, ist dies eine Frage des Stils und dessen, was besser lesbar aussieht. Für mich gefällt der queryBuider die meiste Zeit, er bietet gut definierte Abschnitte für die Abfrage. In der Vergangenheit war es außerdem einfacher, bedingte Logik hinzuzufügen, wenn Sie sie benötigen.
quelle
Mit dem Abfrage-Generator ist es möglicherweise einfacher, einen Komponententest durchzuführen. Angenommen, Sie haben ein Repository, das anhand der komplizierten Liste von Bedingungen nach Daten fragt. Und Sie möchten sicherstellen, dass der Abfrage einige andere Bedingungen hinzugefügt werden, wenn eine bestimmte Bedingung an das Repository übergeben wird. Bei DQL haben Sie zwei Möglichkeiten:
1) Um Fixtures zu verwenden und die reale Interaktion mit DB zu testen. Was ich etwas lästig und uneinheitlich finde.
2) Um den generierten DQL-Code zu überprüfen. Was Ihren Test zu zerbrechlich machen kann.
Mit QueryBuilder können Sie es durch mock ersetzen und überprüfen, ob die Methode "andWhere" mit dem erforderlichen Parameter aufgerufen wird. Natürlich sind solche Überlegungen nicht anwendbar, wenn Ihre Abfrage einfach ist und nicht von Parametern abhängt.
quelle