Trabalhei bastante no
Zend_Db
biblioteca, que inclui uma classe PHP para construir consultas SQL
. Decidi tentar lidar com todas as sintaxes SQL imagináveis em WHERE
e HAVING
cláusulas, por vários motivos:-
PHP é uma linguagem de script que analisa e compila código em cada solicitação (a menos que você use um cache de bytecode). Portanto, o ambiente PHP é sensível a bibliotecas de código volumosas - mais do que Java ou C# ou Python ou o que você tem. Portanto, é uma alta prioridade manter as bibliotecas tão enxutas quanto possível.
Todos osZend_Db
biblioteca em que trabalhei tinha cerca de 2.000 linhas de código PHP. Por outro lado, o Java Hibernate está na ordem de 118K linhas de código. Mas isso não é um problema, pois uma biblioteca Java é pré-compilada e não precisa ser carregada em todas as solicitações.
-
As expressões SQL seguem uma gramática generativa que é mais compacta e mais fácil de ler e manter do que qualquer construção baseada em PHP que você mostrou. Aprender a gramática da expressão SQL é muito mais fácil do que aprender uma API que pode simulá-la. Você acaba apoiando uma "gramática simplificada". Ou então você começa assim e se vê coagido por sua comunidade de usuários em Feature Creep até que sua API seja inutilmente complexa.
-
Para depurar um aplicativo que usa essa API, você inevitavelmente precisa ter acesso à expressão SQL final, portanto, trata-se do a abstração mais vazada você pode ter.
-
A única vantagem de usar uma interface baseada em PHP para expressões SQL seria que ela auxilia a conclusão de código em editores inteligentes e IDEs. Mas quando tantos operadores e operandos usam constantes de string como'>='
, você estraga qualquer inteligência de conclusão de código.
atualizar: Acabei de ler um bom artigo de blog "A Farewell to ORMs ." O escritor, Aldo Cortesi, sugere usar a SQL Expression Language no SQLAlchemy do Python. Açúcar sintático e sobrecarga de operadores que é padrão em Python (mas não suportado em PHP) tornam esta uma solução de geração de consulta muito eficaz.
Você também pode olhar para o DBIx::Class do Perl, mas ele acaba sendo bem feio.