Formation PUB030 : Laravel, 2019 Le modèle de données

7.8 Modificateurs de portée des requêtes (query scopes)


Il est possible de coder, dans le modèle, des modificateurs de portée pour les requêtes. En anglais, on les appellera « query scopes ».

Par exemple, il serait pratique d'avoir un modificateur de portée permettant de retrouver rapidement les chalets qui sont prêts pour la location.

Dans le modèle, le modificateur de portée sera une fonction dont le nom débute par scope suivi du nom qui sera utilisé dans la requête. Le modificateur de portée recevra toujours en paramètre une chaîne contenant une requête.

Ex :

Modèle Laravel (PHP)

// ******************************************************************

// Modification de la portée des requêtes (query scopes).

// ******************************************************************

 

/**

 * Modificateur de portée permettant de n'avoir que les chalets qui sont prêts pour la location.

 *

 * @param $query

 */

public function scopePretPourLocation($query)

{

    return $query->where('chalets.pretpourlocation', '=', true);

}

Vous n'avez pas à vous soucier de la chaîne contenant la requête : Laravel se chargera de la passer pour vous.

Il sera désormais plus facile de retrouver tous les chalets qui sont prêts :

Contrôleur Laravel (PHP)

$chalets = Chalet::pretPourLocation();

Remarquez que lors de la déclaration de la fonction, on utilisait une majuscule après le mot scope mais que lors de l'appel, on utilisera une minuscule.

Important : lorsque des champs sont nommés dans les paramètres du where, il faut préciser le nom de la table (ex : chalets.pretpourlocation) car lors de l'utilisation du modificateur de portée dans une requête, il pourrait arriver que d'autres tables soient liées et que le nom du champ ne soit plus unique.

Modificateur de portée avec paramètre

Au besoin, le modificateur de portées pourrait recevoir un paramètre. Ceci sera réalisé en ajoutant un second paramètre dans la déclaration de la fonction.

Ex :

Modèle Laravel (PHP)

/**

 * Modificateur de portée permettant de n'avoir que les réservations pour un nombre de nuitées donné.

 *

 * @param $query

 */

public function scopeNuitees($query, $valeur)

{

    return $query->where('reservations.nuitees', '=', $valeur);

}

Et pour retrouver les réservations faites pour 2 nuitées :

Contrôleur Laravel (PHP)

$reservations = Reservation::nuitees(2);

Pour plus d'information

« Eloquent: Getting Started - Local Scopes ». Laravel. https://laravel.com/docs/master/eloquent#local-scopes

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre