Encore hier je parlais des moments où je mettais à la poubelle quelques jours de code parce que je n’étais finalement pas satisfait du résultat. Eh bien ce matin, nouvel épisode, suite à ma tentative de fermer ce ticket, pour simplifier la création des requêtes SQL.
Depuis quelques jours j’avais entrepris d’intégrer dans Clearbricks un constructeur de requête, avec les tests unitaires et de couverture qui vont avec. Hier et aujourd’hui j’ai commencé à modifier le code côté Dotclear afin de vérifier si son application rendait le code plus lisible ou plus facile à écrire.
Conclusion : pas franchement !
Exemple avec cette fonction qui récupère un compte de billets par catégorie. Voilà la fonction originale :
private function getCategoriesCounter($params = array())
{
$strReq =
'SELECT C.cat_id, COUNT(P.post_id) AS nb_post ' .
'FROM ' . $this->prefix . 'category AS C ' .
'JOIN ' . $this->prefix . "post P ON (C.cat_id = P.cat_id AND P.blog_id = '" . $this->con->escape($this->id) . "' ) " .
"WHERE C.blog_id = '" . $this->con->escape($this->id) . "' ";
if (!$this->core->auth->userID()) {
$strReq .= 'AND P.post_status = 1 ';
}
if (!empty($params['post_type'])) {
$strReq .= 'AND P.post_type ' . $this->con->in($params['post_type']);
}
$strReq .= 'GROUP BY C.cat_id ';
$rs = $this->con->select($strReq);
$counters = array();
while ($rs->fetch()) {
$counters[$rs->cat_id] = $rs->nb_post;
}
return $counters;
}
Et voilà le même code utilisant le constructeur :
private function getCategoriesCounter($params = array())
{
$query = sql::make($this->con->driver(), 'select');
$query
->columns('C.cat_id', $query->alias('COUNT(P.post_id)', 'nb_post'))
->from($query->alias($this->prefix . 'category', 'C'))
->join(
$this->prefix . 'post P',
$query->cond('C.cat_id = P.cat_id AND P.blog_id = ?', $this->con->escape($this->id)));
$cond = $query->cond('C.blog_id = ?', $this->con->escape($this->id));
if (!$this->core->auth->userID()) {
$cond->andWith('P.post_status = 1');
}
if (!empty($params['post_type'])) {
$cond->andWith('P.post_type', $this->con->in($params['post_type']));
}
$query
->where($cond)
->groupBy('C.cat_id');
$strReq = $query->sql();
$rs = $this->con->select($strReq);
$counters = array();
while ($rs->fetch()) {
$counters[$rs->cat_id] = $rs->nb_post;
}
return $counters;
}
On y gagne en gestion des espaces entre les éléments de la requête, qu’il ne faut pas oublier, mais pour le reste, je reste circonspect. C’est finalement plus verbeux, il faut retrouver la doc de chacune des méthodes utilisées ce qui n’a rien de trivial quand on ne gère des requêtes qu’épisodiquement.
Alors je vais basculer tout ce code vers une branche particulière côté Clearbricks et voir s’il y a un moyen plus simple de gérer ça…