A veces, cuando estás ansioso por cargar relaciones en modelos de Laravel, es posible que desees limitar la cantidad de modelos relacionados que se devuelven.
Por ejemplo, en una plataforma de blogs, es posible que quieras cargar cada autor en el sistema junto con tres de sus publicaciones.
En versiones anteriores de Laravel, limitar las relaciones cargadas de entusiasmo era una tarea un poco complicada. Realmente nunca pude encontrar una manera elegante de hacerlo que me pareciera bien. Así que normalmente instalé el paquete staudenmeir/eloquent-eager-limit de Jonas Staudenmeir (@staudenmeir) que agrega esta funcionalidad.
Sin embargo, a principios de este año, la funcionalidad principal detrás de ese paquete se fusionó en el propio marco de trabajo de Laravel. Esto significa que en Laravel 11 podemos limitar las relaciones cargadas sin necesidad de instalar ningún paquete adicional.
Veamos un ejemplo.
Digamos que tenemos una plataforma de blogs y queremos cargar cada autor en el sistema junto con tres de sus publicaciones.
Podemos lograr esto usando el método de límite en la consulta de carga ansiosa:
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 en el ejemplo de código anterior, hemos definido que queremos cargar con entusiasmo la relación de publicaciones en el modelo App\Models\Author. En la consulta de carga ansiosa, hemos utilizado el método de límite para especificar que solo queremos cargar tres publicaciones.
Para cualquier persona interesada, la consulta anterior generaría dos consultas SQL.
La primera consulta recupera los autores de la base de datos:
SELECT * FROM `authors`
La segunda consulta recupera las tres publicaciones de cada autor (suponiendo que tengamos 5 autores en el 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`Lectura adicional
Si disfrutó leyendo esta publicación, es posible que le interese consultar mi libro electrónico de 220 páginas "Battle Ready Laravel", que cubre temas similares con más profundidad.
O quizás quieras consultar mi otro libro electrónico de 440 páginas "Consumo de API en Laravel", que te enseña cómo usar Laravel para consumir API de otros servicios.
Si estás interesado en recibir actualizaciones cada vez que publico una nueva publicación, no dudes en suscribirte a mi boletín informativo.
¡Sigue creando cosas increíbles! ?
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3