Ho lavorato parecchio su Zend_Db
libreria, che include una classe per la costruzione di query SQL
. Ho deciso di provare a gestire ogni immaginabile sintassi SQL in WHERE
e HAVING
clausole, per diversi motivi:
-
PHP è un linguaggio di scripting che analizza e compila il codice su ogni richiesta (a meno che non utilizzi una cache di bytecode). Quindi l'ambiente PHP è sensibile alle ingombranti librerie di codice, più di Java o C# o Python o altro. È quindi una priorità assoluta mantenere le biblioteche il più snelle possibile.
Tutto il
Zend_Db
la libreria su cui ho lavorato era di circa 2.000 righe di codice PHP. Al contrario, Java Hibernate è nell'ordine di 118.000 righe di codice. Ma non è un grosso problema poiché una libreria Java è precompilata e non deve essere caricata ad ogni richiesta. -
Le espressioni SQL seguono una grammatica generativa più compatta e più facile da leggere e mantenere rispetto a qualsiasi costruzione basata su PHP che hai mostrato. L'apprendimento della grammatica dell'espressione SQL è molto più semplice dell'apprendimento di un'API in grado di simularla. Finisci per supportare una "grammatica semplificata". Oppure inizi in questo modo e ti ritrovi costretto dalla tua comunità di utenti a Feature Creep fino a quando la tua API non è inutilizzabile.
-
Per eseguire il debug di un'applicazione che utilizzava una tale API, avresti inevitabilmente bisogno dell'accesso all'espressione SQL finale, quindi si tratta di astrazione più fuorviante Puoi avere.
-
L'unico vantaggio dell'utilizzo di un'interfaccia basata su PHP per le espressioni SQL sarebbe che aiuta il completamento del codice negli editor intelligenti e negli IDE. Ma quando così tanti operatori e operandi usano costanti stringa come
'>='
, rovini qualsiasi intelligenza di completamento del codice.
aggiornamento: Ho appena letto un buon articolo sul blog "Addio agli ORM ." L'autore, Aldo Cortesi, suggerisce di utilizzare il linguaggio di espressione SQL in SQLAlchemy di Python. Lo zucchero sintattico e il sovraccarico degli operatori standard in Python (ma non supportato in PHP) rendono questa soluzione molto efficace per la generazione di query.
Potresti anche guardare DBIx::Class di Perl, ma finisce per essere piuttosto brutto.