Parfois, lorsque vous avez hâte de charger des relations sur des modèles Laravel, vous souhaiterez peut-être limiter le nombre de modèles associés renvoyés.
Par exemple, sur une plateforme de blogs, vous souhaiterez peut-être charger chaque auteur du système ainsi que trois de ses articles.
Dans les anciennes versions de Laravel, limiter les relations chargées avec impatience était une tâche un peu délicate. Je n’ai jamais vraiment trouvé une façon élégante de le faire qui me paraisse juste. J'ai donc généralement installé le package staudenmeir/eloquent-eager-limit de Jonas Staudenmeir (@staudenmeir) qui ajoute cette fonctionnalité.
Cependant, au début de cette année, la fonctionnalité de base derrière ce package a été fusionnée dans le framework Laravel lui-même. Cela signifie donc que dans Laravel 11, nous pouvons limiter les relations chargées avec impatience sans avoir besoin d'installer de packages supplémentaires.
Prenons un exemple.
Disons que nous avons une plate-forme de blogs et que nous souhaitons charger chaque auteur du système avec trois de ses articles.
Nous pouvons y parvenir en utilisant la méthode limit dans la requête de chargement hâtif :
use App\Models\Post; use App\Models\Author; use Illuminate\Contracts\Database\Eloquent\Builder; $authors = Author::query() ->with([ 'posts' => fn (Builder $query): Builder => $query->limit(3), ]) ->get();
Comme nous pouvons le voir dans l'exemple de code ci-dessus, nous avons défini que nous souhaitons charger avec impatience la relation des publications sur le modèle App\Models\Author. Dans la requête de chargement rapide, nous avons utilisé la méthode limit pour spécifier que nous souhaitons uniquement charger trois publications.
Pour toute personne intéressée, la requête ci-dessus générerait deux requêtes SQL.
La première requête récupère les auteurs dans la base de données :
SELECT * FROM `authors`
La deuxième requête récupère les trois publications pour chaque auteur (en supposant que nous ayons 5 auteurs dans le système) :
SELECT * FROM ( SELECT *, row_number() OVER (PARTITION BY `posts`.`author_id`) AS `laravel_row` FROM `posts` WHERE `posts`.`author_id` IN (1, 2, 3, 4, 5) ) AS `laravel_table` WHERE `laravel_row`Lectures complémentaires
Si vous avez aimé lire cet article, vous pourriez être intéressé à consulter mon ebook de 220 pages "Battle Ready Laravel" qui couvre des sujets similaires plus en profondeur.
Ou, vous voudrez peut-être consulter mon autre ebook de 440 pages "Consommation d'API dans Laravel" qui vous apprend à utiliser Laravel pour consommer des API d'autres services.
Si vous souhaitez être informé à chaque fois que je publie un nouvel article, n'hésitez pas à vous inscrire à ma newsletter.
Continuez à créer des trucs géniaux ! ?
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3