sql >> Database teknologi >  >> RDS >> Mysql

Håndtering af komplekse WHERE-klausuler med en PHP Query Builder

Jeg arbejdede en del på Zend_Db bibliotek, som inkluderer en PHP klasse til at konstruere SQL-forespørgsler . Jeg besluttede at satse på at prøve at håndtere enhver tænkelig SQL-syntaks i WHERE og HAVING klausuler af flere grunde:

  • PHP er et scriptsprog, der analyserer og kompilerer kode på hver anmodning (medmindre du bruger en bytekode-cache). Så PHP-miljøet er følsomt over for omfangsrige kodebiblioteker - mere end Java eller C# eller Python eller hvad har du. Det er derfor en høj prioritet at holde bibliotekerne så slanke, som vi kan.

    Alle Zend_Db biblioteket, jeg arbejdede på, var omkring 2.000 linjer PHP-kode. Derimod er Java Hibernate i størrelsesordenen 118K kodelinjer. Men det er ikke så meget af et problem, da et Java-bibliotek er prækompileret og ikke skal indlæses ved hver anmodning.

  • SQL-udtryk følger en generativ grammatik, der er mere kompakt og lettere at læse og vedligeholde, end nogen af ​​de PHP-baserede konstruktioner, du viste. At lære SQL-udtryksgrammatikken er langt nemmere end at lære en API, der kan simulere det. Du ender med at støtte en "forenklet grammatik." Eller også starter du på den måde og ser dig selv tvunget af dit brugerfællesskab til Feature Creep indtil din API er ubrugelig kompleks.

  • For at fejlsøge en applikation, der brugte en sådan API, har du uundgåeligt brug for adgang til det endelige SQL-udtryk, så det handler om lækkeste abstraktion du kan have.

  • Den eneste fordel ved at bruge en PHP-baseret grænseflade til SQL-udtryk ville være, at den hjælper med kodefuldførelse i smarte editorer og IDE'er. Men når så mange af operatorerne og operanderne bruger strengkonstanter som '>=' , ødelægger du enhver kodefuldførelsesintelligens.

opdatering: Jeg har lige læst en god blogartikel "A Farewell to ORMs ." Forfatteren, Aldo Cortesi, foreslår at bruge SQL Expression Language i Pythons SQLAlchemy. Syntaktisk sukker og operatøroverbelastning, der er standard i Python (men ikke understøttet i PHP) gør dette til en meget effektiv løsning til at generere forespørgsler.

Du kan også se på Perls DBIx::Class, men den ender med at blive ret grim.



  1. Hvordan kan jeg lave en primær nøgle som AUTOINCREMENT

  2. MySQL:Sorter efter felt, placer tomme celler i slutningen

  3. Hvad betyder nøgleordet KEY?

  4. Inkluder nulresultater i group_concat