"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Limitar relacionamentos ansiosos em modelos Laravel

Limitar relacionamentos ansiosos em modelos Laravel

Publicado em 2024-11-07
Navegar:931

Limit Eager Loaded Relationships on Laravel Models

Introdução

Às vezes, quando você está ansioso para carregar relacionamentos em modelos Laravel, você pode querer limitar o número de modelos relacionados que são retornados.

Por exemplo, em uma plataforma de blog, você pode querer carregar cada autor no sistema junto com três de suas postagens.

Em versões mais antigas do Laravel, limitar relacionamentos carregados e ávidos era uma tarefa um pouco complicada. Eu nunca consegui encontrar uma maneira elegante de fazer isso que parecesse certa. Então, eu normalmente instalo o pacote staudenmeir/eloquent-eager-limit de Jonas Staudenmeir (@staudenmeir) que adiciona essa funcionalidade.

No entanto, no início deste ano, a funcionalidade principal por trás desse pacote foi incorporada ao próprio framework Laravel. Então, isso significa que no Laravel 11, podemos limitar relacionamentos carregados antecipadamente sem a necessidade de instalar nenhum pacote adicional.

Vamos dar uma olhada em um exemplo.

Limitando relacionamentos ansiosos no Laravel

Digamos que temos uma plataforma de blog e queremos carregar cada autor no sistema junto com três de suas postagens.

Podemos conseguir isso usando o método limit na consulta de carregamento rápido:

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();

Como podemos ver no exemplo de código acima, definimos que queremos carregar antecipadamente o relacionamento posts no modelo App\Models\Author. Na consulta de carregamento antecipado, usamos o método limit para especificar que queremos carregar apenas três postagens.

As consultas SQL subjacentes

Para qualquer pessoa interessada, a consulta acima geraria duas consultas SQL.

A primeira consulta busca os autores no banco de dados:

SELECT * FROM `authors`

A segunda consulta busca os três posts de cada autor (assumindo que temos 5 autores no sistema):

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` 



Leitura adicional

Se você gostou de ler este post, talvez esteja interessado em conferir meu e-book de 220 páginas "Battle Ready Laravel", que cobre tópicos semelhantes com mais profundidade.

Ou você pode conferir meu outro e-book de 440 páginas "Consumindo APIs no Laravel", que ensina como usar o Laravel para consumir APIs de outros serviços.

Se você estiver interessado em ser atualizado sempre que eu publicar uma nova postagem, sinta-se à vontade para se inscrever no meu boletim informativo.

Continue construindo coisas incríveis! ?

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/ashallendesign/limit-eager-loaded-relationships-on-laravel-models-4c43?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3