sql >> Base de Datos >  >> RDS >> Mysql

Manejo de cláusulas WHERE complejas con PHP Query Builder

Trabajé bastante en el Zend_Db biblioteca, que incluye una clase PHP clase para construir consultas SQL . Decidí intentar manejar todas las sintaxis SQL imaginables en WHERE y HAVING cláusulas, por varias razones:

  • PHP es un lenguaje de secuencias de comandos que analiza y compila el código en cada solicitud (a menos que use un caché de bytecode). Entonces, el entorno PHP es sensible a las bibliotecas de código voluminosas, más que Java o C # o Python o lo que sea. Por lo tanto, es una alta prioridad mantener las bibliotecas lo más eficientes posible.

    Todos los Zend_Db La biblioteca en la que trabajé tenía unas 2000 líneas de código PHP. Por el contrario, Java Hibernate tiene unas 118 000 líneas de código. Pero eso no es un gran problema ya que una biblioteca de Java está precompilada y no tiene que cargarse en cada solicitud.

  • Las expresiones SQL siguen una gramática generativa que es más compacta y más fácil de leer y mantener que cualquiera de las construcciones basadas en PHP que mostró. Aprender la gramática de expresiones SQL es mucho más fácil que aprender una API que pueda simularla. Terminas apoyando una "gramática simplificada". O empiezas de esa manera y te encuentras obligado por tu comunidad de usuarios a Feature Creep hasta que su API sea inutilizablemente compleja.

  • Para depurar una aplicación que usaba una API de este tipo, inevitablemente necesitaría acceso a la expresión SQL final, por lo que se trata de abstracción más fugaz tu puedes tener.

  • La única ventaja de usar una interfaz basada en PHP para expresiones SQL sería que ayuda a completar el código en editores inteligentes e IDE. Pero cuando tantos operadores y operandos usan constantes de cadena como '>=' , echas a perder cualquier inteligencia de finalización de código.

actualización: Acabo de leer un buen artículo de blog "Adiós a los ORM ." El escritor, Aldo Cortesi, sugiere usar el Lenguaje de expresiones SQL en SQLAlchemy de Python. El azúcar sintáctico y la sobrecarga de operadores que es estándar en Python (pero no compatible con PHP) hacen de esta una solución de generación de consultas muy eficaz.

También puede mirar DBIx::Class de Perl, pero termina siendo bastante feo.