hola a todos,
dato che per adesso sono relegato a casa per via di malanni vari sto passando un poco di tempo e volevo sviluppare un Query Abstraction Layer per il mio Database Abstraction Layer (il QAL mi serve per poggiarci su sviluppare, ancora più dopo, un ORM
)
Ho dato un occhiata un pò qua e la e, inizialmente, pensavo di realizzare un sistema a cui passavo gli array per definire la query ma, parlando con alcune persone, mi sono reso conto che effettivamente è troppo macchinoso.
Una delle alternative è quella di scrivere un linguaggio SQL intermedio, o prendere un linguaggio SQL specifico da convertire con i vari driver, e tramite un parser poi interpretarlo ed eseguirlo. Soluzione sicuramente interessante però macchinosa perché ci vuole un parser che faccia tante operazioni 
Guardando un pò qua e la ho notato doctrine che è un ORM è per il suo sistema utilizza un qualcosa di molto carino, qui c'è un esempio
codice:
$q = new Doctrine_Query();
$rows = $q->update('Account')
->set('amount', 'amount + 200')
->where('id > 200')
->execute();
sinceramente, io, vorrei fare qualcosa di più nel senso che ora come ora se pur estremamente flessibile secondo me puè essere espando ancora di più
Volevo scrivere un sistema simile, qualcosa tipo
codice:
$query = new QAL_Query();
$query->select()
->fields('tabella1.campo1', 'tabella1.campo2 AS campo4', 'tabella2.campo3')
->field('tabell2.anotherfield')
->from('tabella1')
->innerjoin()->with('tabella2')->using('tabella2.indice=tabella1.indice')
->where()->field('tabella1.campo1='TEST')
ora, questo sistema, allunga leggermente il codice, però credo renda il tutto leggermente più leggibile
il problema è però che così si è comunque ed in ogni caso costrutetti ad usare un po di SQL dentro i vari campo con la conseguenza che alcune query potrebberò non essere compatibili! Al che pensavo di espandere il tutto ancora di più ma si tradurrebbe in qualcosa tipo
codice:
$query = new QAL_Query();
$query->select()
->fields('tabella1.campo1', 'tabella2.campo3')
->field('tabella1.campo2')->as('campo4')
->field('tabell2.anotherfield')
->from('tabella1')
->innerjoin()->with('tabella2')->using('tabella2.indice')->equal('tabella1.indice')
->where()->field('tabella1.campo1')->equal('TEST')
cosi riduco un pò il tutto ... però mettiamo che debba mettere l'estrazione di un count con un group by
codice:
$query = new QAL_Query();
$rows = $query->select()
->fields('tabella1.campo1', 'tabella2.campo3')
->field('tabella1.campo2')->as('campo4')
->field('tabell2.anotherfield')
->value('valorefisso')
->field()->count('*')->as('conteggio')
->field()->concat()->value()->field('campo1')->value('|')->value()->field('campo2')
->from('tabella1')
->innerjoin()->with('tabella2')->using('tabella2.indice')->equal('tabella1.indice')
->where()->field('tabella1.campo1')->equal('TEST')
->groupby('campo4')
->execute();
in pratica i vari comandi SQL si "traducono" in una sequenza di metodi dell'oggetto della query
ora ... la comprensibilità di una cosa del genere non sono propriamente molto convinto che sia superiore perché effettivamente c'è un gran bel casino! ... a livello di prestazioni credo che si dovrebbe comunque stare sotto i tempo del parser però se la leggibilità e la manutentibilità del codice rasenta lo zero, effettivamente non so più la convienenza di un sistema troppo precisino.
Questo sistema, l'unica cosa che si ritroverebbe a fare, è a segnare le varie condizioni ... per esempio un metodono value richiamato senza parametri indica al sistema che lo stato corrente è WaitingAValue oppure un campo field vuoto WaitingAField in modo che il count presente dopo il field dica al sistema che il campo è un COUNT su * ... e l'as presente dice al sistema che il Field o il Value precedente ha quello specifico alias
voi che suggerite?