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 avec trois de ses articles.
Dans les anciennes versions de Laravel, limiter les relations chargées et enthousiastes était une tâche un peu fastidieuse. 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é principale 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 sans avoir besoin d'installer de packages supplémentaires.
Regardons un exemple.
Disons que nous avons une plateforme 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 souhaitions charger avec impatience la relation des publications sur le modèle AppModelsAuthor. Dans la requête de chargement hâtif, 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 de 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` <= 3 ORDER BY `laravel_row`
Si vous avez aimé lire cet article, vous pourriez être intéressé à consulter mon ebook de plus de 220 pages "Battle Ready Laravel" qui couvre des sujets similaires plus en profondeur.
Ou, vous voudrez peut-être consulter mon autre ebook de plus 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 ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!