Maison  >  Article  >  développement back-end  >  Limiter les relations chargées avec impatience sur les modèles Laravel

Limiter les relations chargées avec impatience sur les modèles Laravel

王林
王林original
2024-09-09 18:30:15344parcourir

Limit Eager Loaded Relationships on Laravel Models

Introduction

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.

Limiter les relations chargées et impatientes dans Laravel

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.

Les requêtes SQL sous-jacentes

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`

Lectures complémentaires

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn