En développant avec Laravel, vous serez forcément amenés à réaliser des requêtes vers votre base de données, et donc d'utiliser le query builder. Et vous allez probablement vous confronter au problème suivant : bien que les méthodes proposées par Laravel permettent de faire beaucoup de choses, il serait bien de pouvoir en ajouter. Par exemple, dans notre code, je me trouvais souvent confronté à une situation : certaines colonnes dans ma base de données peuvent avoir la valeur null ou 0, et elles doivent être traitées de la même manière. J'étais donc obligé sur chaque requête de faire une condition double where(colonne, 0)->orWhereNull(colonne), le tout encapsulé dans une function anonyme pour gérer les priorités du or / and en sql, assez lourd. J'ai donc cherché la mnière de créer ma propre méthode zero_ou_null($colonne), pour gagner du temps et de la lisibilité.
Une première chose qui peut parraitre troublante pour un non initié : Laravel dispose de 2 query builder, très similaires. L'un d'eux est utilisé avec Eloquent, l'autre est utilisé lorsque vous réalisez des requêtes avec DB::query()
Il existe deux manières différentes d'étendre ces query builder, que nous allons détailler ici.
C'est la méthode que nous utilisons le plus chez Easy Développement.
Note : pour utiliser cette technique, il est nécessaire que tous vos modèles héritent de la même classe (qui elle même hérite du model standard Laravel). Ce n'est pas une obligation en soit, mais si vous n'utilisez pas cette technique, il faudra dupliquer le code sur chacun de vos modèles, ce qui me semble à proscrire.
Pour étendre le query builder d'Eloquent, rien de plus simple :
Dans votre classe modèle "mère", il suffit d'ajouter le code suivant :
Eden_query_builder est ici notre query builder sur mesure, que j'ai positionnée dans mon répertoire Models. Bien entendu, vous le mettez où cela vous semble pertinent. Il faut également bien entendu faire un "use" de cette classe dans votre fichier de modèle de base.
Ce code permettra, pour chaque requête d'instancier un query builder personnalisé, au lieu d'utiliser le query builder standard de Laravel.
Et dans cette classe, le code suivant est suffisant :
Vous remarquez que nous héritons du query builder standard, ce qui nous permet bien entendu de profiter de toutes les méthodes standard proposées par Laravel / Eloquent.
Et cette méthode peut ensuite s'utiliser comme une méthode standard :
Nous utilisons très peu (voir jamais) le query builder standard de Laravel (celui qui ne se base pas par Eloquent)
Pour cela, j'ai suivi un tuto : étendre le query builder de laravel
Le tuto répond exactement au besoin, je ne vais donc pas paraphrasé, et il faut rendre à César ce qui est à César.
A noter qu'en le suivant, il manque quelques informations dans ce tuto, notamment, de mémoire il faut inclure des use pour les classes QueryGrammar et SchemaGrammar, qui sont des alias. Je n'ai malheureusement pas gardé le code utilisé pour tester la méthode, mais au besoin, utilisez les commentaires pour les questions j'y répondrai avec plaisir ;)