2012-07-17 12 views
6

Qualcuno può fornirmi un paio di motivi chiari (supportati) per utilizzare/imparare DQL vs. SQL quando si ha bisogno di una query personalizzata mentre si lavora con Doctrine Classes?Con Doctrine quali sono i vantaggi dell'utilizzo di DQL su SQL?

Trovo che se non riesco a utilizzare la funzionalità relazionale incorporata di un ORM per ottenere qualcosa, di solito scrivo un metodo personalizzato nella classe DoctrineTable o Doctrine estesa. In questo metodo scrivi il necessario in SQL diretto (usando PDO con istruzioni preparate/protezione dell'iniezione, ecc ...). DQL sembra che una lingua addizionale per imparare/eseguire il debug/manutenere non appaia fornisca sufficienti motivi validi da usare nelle situazioni più comuni. DQL non sembra essere molto meno complesso di SQL per garantirne l'utilizzo, anzi dubito che si possa usare efficacemente DQL senza avere una solida conoscenza di SQL. La maggior parte delle porte di sintassi SQL di base è abbastanza buona tra i DB più comuni che utilizzerai con PHP.

Cosa mi sfugge/mi domando? Sono sicuro che c'è una ragione, ma mi piacerebbe sentire da persone che l'hanno intenzionalmente usato in modo significativo e che cosa il guadagno è stato sopra cercando di lavorare con SQL plain-ole.

Non sto cercando un argomento che supporti gli ORM, solo DQL quando si ha bisogno di fare qualcosa al di fuori delle esigenze di base del tipo 'get-by-relationship', in un setup LAMP tradizionale (usando mysql, postgres, ecc ...)

+3

Non ho argomenti supportati dal fatto, ma ho trovato che le relazioni con i nomi sono più facili da usare rispetto alle condizioni di join, un po 'meno incline agli errori e noiose da scrivere. –

risposta

3

Per essere onesti, ho imparato SQL usando Doctrine1.2 :) Non ero nemmeno a conoscenza di chiavi esterne, operazioni in cascata, funzioni complesse come group_concat e molte altre cose. La ricerca indicizzata è anche una cosa molto bella e maneggevole che funziona semplicemente fuori dalla scatola.

DQL è molto più semplice da scrivere e comprendere il codice. Per esempio, la seguente interrogazione:

$query = ..... // some query for Categories 
    ->leftJoin("c.Products p") 

farà LEFT JOIN tra categorie e prodotti e non si deve scrivere su p.category_id = c.id.

E se in futuro si cambia relazione da uno-2-molti per dire molti-2-molti, questa stessa query funzionerà senza alcuna modifica. La dottrina si prenderà cura di questo. Se lo si farebbe utilizzando SQL, tutte le query dovrebbero essere modificate per includere quella tabella molti-2-molti intermediari.

+0

+1, in particolare la relazione tra oggetti (chiave esterna) è già connessa nella classe Base – KJA

+1

@Zeljko delle risposte che ho ricevuto, il tuo ultimo punto nelle tue risposte in merito al cambiamento dei tipi di relazione è l'unico convincente per la mia situazione. Non mi interessa tanto il motivo per cui è un bene per le persone che non capiscono come funziona il lavoro relazionale di db - buono per i principianti non è sempre il migliore a lungo termine. Inoltre, dato che si nota la clausola ON ... a volte si desidera aggiungere ulteriori criteri oltre alle chiavi all'interno della clausola 'ON' - DQL non lo supporta per quanto ne so. Questo è un esempio di facile per la maggior parte di ciò che devi fare, ma estremamente difficile da usare per determinate situazioni. – Ray

+0

Hai ragione, avrai clausole aggiuntive. In questo caso, DQL fornisce l'istruzione 'WITH'. E sì; quello funzionerà anche con entrambi one-2-one, one-2-many, many-2-many ... senza cambiamenti nel codice. Il mio consiglio: provalo. Una volta che ti agganci, non tornerai mai indietro. È come guidare la prima classe della Mercedes contro il livello inferiore di Yugo. Entrambi ti porteranno dal punto A al punto B ma non vedo le linee formate per Yugo. – Zeljko

2

Trovo DQL più leggibile e pratico. Se lo configuri correttamente, sarà più facile unire oggetti e le query saranno più facili da scrivere.

Il tuo codice sarà facile da migrare a qualsiasi RDBMS.

E, soprattutto, DQL è il linguaggio di query oggetto per il modello di oggetto, non per lo schema relazionale.

+0

Penso che il tuo primo sia qualitativo - ho visto DQL davvero complicato/complesso per eseguire compiti che potrebbero essere risolti da semplici queries SQL. Il tuo secondo punto sono completamente d'accordo, ma come notato nella mia domanda non è una preoccupazione per l'SQL di base necessario per fare tutto ciò che DQL può realizzare. Il tuo ultimo punto è il modo più interessante per guardarlo. Ok, è un linguaggio di query per oggetti non lo storage sottostante. Cosa vede come il vantaggio principale di un linguaggio di query per gli oggetti? Migliora le prestazioni? Supporta un modello OO ben controllato? Permette un codice più efficiente/migliore? – Ray

+0

@Ray dopo aver usato Doctrine 1.2, è davvero dannoso per le prestazioni. – KJA

+0

avete qualche riferimento per capire la classe del modello che la dottrina ha generato (TestTable, BastTest, Test) e come gestirli correttamente, chi chiamare nel controller? puoi visitare la mia domanda http://stackoverflow.com/questions/11529224/doctrine-table-vs-class-that-extends-from-baseclass – KJA

1

L'utilizzo di DQL consente di gestire gli oggetti. nel caso in cui l'inserimento in databae, si inserisce un oggetto

$test = new Test(); 
$test->attr = 'test'; 
$test->save(); 

in caso di selezione da databae, è necessario selezionare un array e quindi si può riempire in oggetto

public function getTestParam($testParam) 
    { 
     $q=Doctrine_Query::create() 
       ->select('t.test_id , t.attr') 
       ->from('Test t ') 
      $p = $q->execute(); 
      return $p; 
    } 

è possibile controllare la Documentazione di Doctrine per maggiori dettagli

1

La risposta di Zeljko è piuttosto azzeccata.

La ragione più importante per andare con DQL anziché SQL raw (nel mio libro): Doctrine separa l'entità dal modo in cui è persistente nel database, il che significa che le entità non devono cambiare come modifiche di archiviazione sottostanti. Questo, a sua volta, significa che se si desidera apportare modifiche allo storage sottostante (ovvero rinominare colonne, alterare le relazioni), non è necessario toccare il proprio DQL, poiché in DQL si utilizzano invece le proprietà dell'entità (il che avviene solo per essere tradotto dietro le quinte per correggere SQL, in base alle mappature correnti).

+0

Dopo aver lavorato su un'app per il mese passato e aver MOLTI cambiamenti al database, sono d'accordo con questa risposta. – kiwicomb123

Problemi correlati