[Resuelto] Eager loading con Eloquent

Publicado hace 9 meses por ridier.ayala

Estoy usando el componente laravel-debugbar y veo que hay un problema evidente porque con solo un listado de productos me muestra 36 queries...

Por lo general al realizar consultas en Laravel primero obtengo un valor específico de una primera consulta y a ese objeto por medio de sus relaciones las voy recorriendo hasta conseguir lo necesito. Quiero saber en que consiste o cómo funcionaría con eager loading utilizando Eloquent.

Mejor respuesta Marcada por Ecuador ridier.ayala

johfermq hace 9 meses

Para efectos de eager loading, necesitas traer esas relaciones desde la consulta principal utilizando el método with ó load lo que optimizará el número de queries a mínimo dos dependiendo del número de relaciones que tengas, entonces:

  1. Usando el método with, por ejemplo:

$posts = Post::with('users')->get();

Devolverá todos los posts con sus respectivos usuarios y podrás recorrerlos con foreach sin ningún problema.

  1. Usando el método load, sólo cuando necesites evaluar una condición y decidir si cargar o no la relación, ejemplo:

$post = Post::find(1);

if ($post->user_id !== auth()->user()->id) { $post->load('user'); }

Devolverá el post con su respectivo usuario siempre y cuando se cumpla la condición.

  • Si necesitas traer varias relaciones pasas un array: ->with(['user', 'comments']) ó ->load(['user', 'comments'])

  • Si necesitas traer relaciones anidadas, por ejemplo traer el usuario y sus roles: ->with(['user.roles'])

Espero haberte ayudado. Para más información consulta la documentación Eloquent: Relationships - Laravel