Je fais une lecture ces derniers temps de la documentation de Zend Framework. Je suis dans la section traitant de la classe Zend_Db_Table et de l’API de l’objet Select.
Jusqu’à maintenant, ce que je peux voir de Zend_Db_Table me va bien, mais je n’aime vraiment pas l’utilisation proposée pour les requêtes Select.
Exemple : Utilisation simple
$table = new Bugs();
$select = $table->select();
$select->where('bug_status = ?', 'NEW');
$rows = $table->fetchAll($select);
Exemple : Utiliser une table intermédiaire par jointure avec fetchAll()
$table = new Bugs();
$select = $table->select();
$select->where('bug_status = ?', 'NEW')
       ->join('accounts', 'accounts.account_name = bugs.reported_by')
       ->where('accounts.account_name = ?', 'Bob');
$rows = $table->fetchAll($select);
Je sais que je peux continuer de pousser mes requêtes en string comme dans le bon vieux temps, et je trouve ça beaucoup plus lisible et efficace. Ceci dit, j’aimerais savoir quels sont les avantages d’utiliser la syntaxe montrée ci-dessus. Quelqu’un peut me vendre l’idée?










Moi non plus j’ai jamais été un fan de cette méthode
je serais pas en mesure de pouvoir te vendre l’idée, désolé : /
À moins que je me trompe, le point est de rendre les requêtes “database agnostic”. Donc, qu’on écrive pour n’importe quel DB, on va toujours écrire de la même manière. Aussi, une application écrite avec ça pourrait être portée vers une autre DB sans trop de difficulté.
Ouin, c’est le seul point que je vois également…
Ceci dit, les cas réels de passage d’un système de BD à un autre sont plutôt rare, je trouve ça plutôt lourd pour gérer l’improbable…
Moi ce que j’aime bien avec cette façon c’est de pouvoir créer des morceaux de requêtes, les passer dans des méthodes qui ajoute des clauses (genre un order by, un filtrage, etc…) et de l’exécuter ensuite.
Si c’est correctement utilisé, ça protège des injections SQL. C’est aussi plus souple pour composer tes requêtes. Tu peux également paginer facilement des requêtes, même complexe, avec Zend_Paginator.
Tu n’as pas non plus à te soucier de l’ordre des instructions GROUP BY, LIMIT, etc…
J’avoue que j’aime mieux utiliser cette méthode que de concaténer des chaines de caractères de requêtes SQL.
@Maxence: La plupart des API de bases de données (MySQLi, PDO…) permettent maintenant de faire des requêtes compilées (même genre de syntaxe, avec des “?”). Ça prévient les attaques par injection SQL et peu aussi accélérer les requêtes. Il ne faudrait donc pas voir la prévention des injection SQL comme un argument en la faveur de cette manière de construire des requêtes puisque l’API natif offre déjà cette possibilité.
@Antoine C’est vrai, mais les requêtes préparées ne sont pas toujours plus rapides que les requêtes standard.
… mais apparemment Zend_Db prépare systématiquement ses requêtes. Donc mon argument ne tient pas…