Uso del método with para cargar Relaciones con Eager Loading

- Andrés Cruz

In english

Cuando trabajamos con relaciones en Eloquent, a menudo necesitamos cargar todas las relaciones de un modelo específico o de varios, estamos hablando a que tenemos un modelo principal y otro u otros relacionamos mediante una clave foránea y deseamos cargar todos estos datos en una sola consulta, por supuesto, empleando Eloquent y evitando emplear los Joins para facilidad de la consulta; imagina que tienes una tienda en línea con productos, categorías y etiquetas. Quieres obtener todos los productos junto con sus categorías y etiquetas relacionadas. Aquí es donde entra en juego la carga ansiosa (eager loading) de Laravel, ya que, mediante el método de with, podemos especificar las relaciones desde la consulta principal, obteniendo los datos completamente organizados y sin registros repetidos como sucedería si empleamos los JOINs.

La carga ansiosa permite cargar todas las relaciones necesarias al realizar la consulta inicial. En lugar de ejecutar una consulta por cada modelo en la colección, Eloquent realiza una sola consulta adicional para cargar todas las relaciones. Esto mejora significativamente la eficiencia y la velocidad de tu aplicación.

Supongamos que tenemos los siguientes modelos: Product, Category y Tag. Queremos obtener todos los productos junto con sus categorías y etiquetas:

$products = Product::with(['category', 'tags'])->get();

Y ahora, podemos acceder a TODAS sus relaciones sin necesidad de realizar consultas adicionales:

foreach ($products as $product) {
    echo "Product: {$product->name}\n";
    echo "Category: {$product->category->name}\n";
    foreach ($product->tags as $tag) {
        echo "Tag: {$tag->name}\n";
    }
    echo "\n";
}

De esta forma, podemos optimizar las consultas evitando problemas como el de N+1 en Laravel y con esto, tener consultas eficientes; de esta forma, podemos realizar operaciones adicionales muy fácilmente como la de guardar en cache los datos realizados en una sola consulta al emplear consultas SQLs optimizadas.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.