3 QueryBuilders prometteurs.

Pour ce bonus, j’ai testé pour vous 3 QueryBuilders que je trouve très prometteurs. Ils ont chacun leurs particularités et correspondent tous à un langage différent (JS, PHP et C#), comme ça, il y en aura pour tous les goûts !

Knex.js

C’est l’exemple que j’avais utilisé dans l’article, mais je l’ai quand même choisi pour aller un peu plus en profondeur.

Son truc à lui, c’est la flexibilité. Knex.js vous propose beaucoup de manières d’écrire vos requêtes, et si vous n’aimez pas une syntaxe en particulier, vous pouvez toujours opter pour une autre sans que ça impacte le résultat final.

Par exemple :

// SELECT * FROM steak WHERE steak.weight >= 150
// Classique
knex.select('*')
    .from('steak')
    .where('steak.weight', '>=', 150)

// Avec la table en entête
knex('steak')
    .select('*')
    .where('steak.weight', '>=', 150)

// Bloc pour les WHERE plus complexes
knex('steak')
    .where((builder) =>
        builder.where('steak.weight', '>=', 150)
    )
    .select('*')

Honnêtement, le concept est intéressant, mais quitte à choisir, je préfère garder une syntaxe qui soit très proche du SQL, car c’est ce que je trouve le plus facile à lire.

Une autre particularité, c’est sa richesse fonctionnelle quasiment infinie. C’est de loin le QueryBuilder le plus riche en fonctionnalités que j’ai trouvé pendant mes recherches, et il suffit de regarder la documentation pendant 5 secondes pour s’en rendre compte.

Et c’est à peine 1/20 du sommaire…

Téléchargez ici un exemple de code source fait avec Knex.js (Express.js). Les requêtes se trouvent dans le fichier /routes/food.js.

Guide d’installation :

  • Nécessite Node.js
  • Exécutez la commande npm install dans le répertoire racine pour récupérer les dépendances.
  • Lancer le projet avec npm start
  • Tester les requêtes à l’adresse localhost:7500/food

Latitude

Latitude est le meilleur QueryBuilder PHP que j’ai pu trouver, et Dieu sait que la concurrence est rude sur ce langage.

Il a l’avantage d’être extrêmement simple, mais il fait le boulot, surtout pour écrire des petites requêtes.

On pourrait lui reprocher d’être trop simpliste par moments à cause de son manque de fonctionnalités, on est clairement pas sur le niveau de flexibilité et de richesse que Knex.js. Mais je le pardonne, car d’une part, il est toujours activement en développement, et d’autre part, il est open source, et donc très facilement modifiable si vous avez besoin d’une ou deux fonctionnalités supplémentaires.

Note : Latitude ne possède pas de compilateur, ce qui vous oblige à compiler les requêtes vous-même en PHP. Rien de compliqué car PHP gère cela très bien nativement.

$factory = new QueryFactory(new CommonEngine());
$query = $factory->select('*')
    ->from('steak')
    ->where(field('weight')->gte(100))
    ->orderBy('weight', 'DESC')
    ->limit(10)
    ->compile()
;

$statement = $connection->prepare($query->sql());
$statement->execute($query->params());
return new JsonResponse($statement->fetchAll());
Exemple de compilation à la main.

Pour résumer mon avis sur Latitude, je pense que c’est un QueryBuilder qui a de beau jours devant lui s’il continue à s’améliorer.

Téléchargez ici un exemple de code source fait avec Latitude (Symfony). Les requêtes se trouvent dans le fichier /src/Controller/FoodController.php.

Guide d’installation :

  • Nécessite Composer & PHP 7.4
  • Exécutez la commande composer install dans le répertoire racine pour récupérer les dépendances.
  • Lancer le projet avec php -S 127.0.0.1:7500 public
  • Tester les requêtes à l’adresse localhost:7500/food

SqlKata

C’est la référence des QueryBuilders pour .NET (C#, VB.NET, F#…), déjà parce que c’est un des seul, mais surtout parce qu’il est très propre et diablement efficace. Pour tout vous dire, ça doit être mon préféré de cette liste <3

Bien qu’il ne soit pas du niveau de Knex.js, il est très riche en fonctionnalités, et permet de faire des sous-requêtes et des commandes complexes sans trop de soucis.

Il possède aussi un compilateur, ce qui n’est pas de refus étant donné la galère pour exécuter des requêtes sous .NET sans passer par des DataTables ou par un ORM. Malheureusement, bien que le builder soit compatible avec SQLite, il ne possède pas de compilateur pour celui-ci, ce qui m’a obligé à exécuter les requêtes à la main dans mes exemples… Mais si vous utilisez MySQL, SQL Server ou un autre SGBD très classiques, vous ne devriez pas avoir de soucis.

Query query = new Query("steak")
    .Select("steak.id", "steak.weight", "cooking.type")
    .Join("cooking", "cooking.id", "steak.cooking_id")
    .Where("steak.weight", ">=", 150)
    .OrderByDesc("steak.weight")
    .Limit(10)
;

// Formatage du résultat
SqliteDataReader reader = Execute(query);
List<object> res = new List<object>();
while(reader.Read())
{
    res.Add(new
        {
            id = reader.GetInt32(0),
            weight = reader.GetInt32(1),
            cooking = reader.GetString(2)
        }
    );
}

return res;
Avec un compilateur, toute la dernière partie peut sauter.

Téléchargez ici un exemple de code source fait avec SQL Kata (ASP.NET Web API). Les requêtes se trouvent dans le fichier /Controllers/FoodController.cs.

Guide d’installation :

  • Nécessite .NET Core 3.1
  • Exécutez la commande dotnet restore dans le répertoire racine pour récupérer les dépendances.
  • Lancer le projet avec dotnet run
  • Tester les requêtes à l’adresse https://localhost:5001/food

Si vous avez le moindre souci avec le code source, laissez un commentaire, je viendrais à votre secours au plus vite !