2010-04-20 12 views
62

In Dottrina è possibile creare DQL in 2 modi:dottrina: QueryBuilder vs createQuery?

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'); 

Mi chiedo quale sia la differenza e che dovrebbe Io uso?

risposta

60
  1. DQL è più facile da leggere in quanto è molto simile a SQL. Se non è necessario modificare la query a seconda di un set di parametri, questa è probabilmente la scelta migliore.

  2. Query Builder è un'API per costruire query, quindi è più semplice se è necessario creare una query dinamicamente come iterando su un insieme di parametri o filtri. Non è necessario eseguire operazioni sulle stringhe per creare query come join, split o qualsiasi altra cosa.

+0

Ma non c'è un sovraccarico nell'analisi della stringa DQL nel primo caso? Oppure il costruttore crea anche la stessa stringa DQL? –

+2

Sì, QueryBuilder crea la stringa DQL per te. Dopodiché, DQL viene comunque analizzato. – Dennis

31

Query builder è solo, diciamo, l'interfaccia per creare query di ... Dovrebbe essere più comodo da usare, non appena aggiungere() metodo, ma anche metodi come dove(), andwhere (), da(), ecc. Ma alla fine, compone solo query come quella che si usa nel metodo createQuery().

Esempio di utilizzo più avanzato di generatore di query:

$em->createQueryBuilder() 
      ->from('Project\Entities\Item', 'i') 
      ->select("i, e") 
      ->join("i.entity", 'e') 
      ->where("i.lang = :lang AND e.album = :album") 
      ->setParameter('lang', $lang) 
      ->setParameter('album', $album); 
+0

puoi aggiungere -> setParameters (array ('x' => 'y', 'z' => 'w', ...)) –

13

Hanno diversi scopi:

  • DQL è più facile da usare quando si conosce la query full.
  • Query Builder è più intelligente quando si deve creare una query sulla base di alcune condizioni, cicli ecc
4

La differenza principale è il sovraccarico di chiamare i metodi. Il tuo esempio di codice prima (createQuery) solo per semplicità lo rende una chiamata di metodo, mentre il il QueryBuilder rende 4. Alla fine di tutto, scendono a una stringa che deve essere eseguita, primo esempio si sta dando la corda, e l'altro lo state costruendo con chiamate a metodi multipli concatenati.

Se siete alla ricerca di un motivo per utilizzare uno sopra l'altro, che è una questione di stile, e ciò che sembra più leggibile. Per me, mi piace la queryBuider per la maggior parte del tempo, fornisce sezioni ben definite per la query. Inoltre, in passato rende più semplice aggiungere la logica condizionale quando ne hai bisogno.

+0

Una piccola osservazione - Direi che quasi ogni volta che si spende un numero qualsiasi le chiamate alle funzioni PHP, relative all'SQLing, saranno sempre meno importanti del tempo impiegato a parlare, attendere e trarre il risultato effettivo dal DB (per non parlare dell'idratazione di quelle, nel caso degli ORM). – userfuser

1

Potrebbe essere più facile da test di unità quando si utilizza il generatore di query. Supponiamo che tu abbia un repository che interroga alcuni dati basandosi sulla complicata lista di condizioni. E si vuole assicurare che se una condizione particolare viene passata nel repository, alcune altre condizioni vengono aggiunte alla query. In caso di DQL si hanno due opzioni:

1) Per utilizzare infissi e testare la reale interazione con DB. Che trovo un po 'fastidioso e unitario.

2) per controllare il codice DQL generato. Il che può rendere il test troppo fragile.

Con QueryBuilder, è possibile sostituirlo con mock e verificare che venga chiamato il metodo "andhere" con il parametro necessario. Ovviamente tali considerazioni non sono applicabili se la tua query è semplice e non dipende da alcun parametro.

Problemi correlati