Comprobar relaciones anidadas con una sola llamada al método relationLoaded

  • Publicado el 28 mayo, 2025
  • Palabras: 232

Al trabajar con modelos Eloquent en Laravel, la gestión de relaciones es fundamental para una interacción eficiente con bases de datos. Siempre hemos contado con herramientas potentes para cargar relaciones anidadas con una elegante notación de puntos, pero hasta ahora, existía una sorprendente inconsistencia en la forma de verificar la carga de dichas relaciones.

Comprobar relaciones anidadas con una sola llamada al método relationLoaded

#La brecha de las relaciones

Laravel ha permitido desde hace tiempo a los desarrolladores cargar relaciones anidadas con avidez mediante la notación de puntos. Esta sintaxis es intuitiva y expresiva:

 

$user->load('posts.comments');

 

Con una sola línea, puedes cargar los posts de un usuario y todos los comentarios asociados. Esto evita el temido problema de las consultas N+1 y mantiene la eficiencia de tu aplicación.

Sin embargo, antes de Laravel 12.10, al comprobar si estas relaciones estaban cargadas, el método relationshipLoaded() solo funcionaba con relaciones de un solo nivel:

 

// Antes de Laravel 12.10
$user->load('posts.comments');

$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // false

 

Esta inconsistencia significó que los desarrolladores tuvieron que escribir código adicional para verificar las relaciones anidadas, recurriendo a menudo a soluciones alternativas como:

 

// Solución alternativa para comprobar relaciones anidadas
if ($user->relationLoaded('posts') && $user->posts->first()?->relationLoaded('comments')) {
    // Posts y sus comentarios están cargados.
}

 

#La mejora

Gracias a una contribución de Mahesh Perera en Laravel 12.10, el método relationshipLoaded() ahora admite la misma notación de puntos que usamos para cargar relaciones:

 

// Después de Laravel 12.10
$user->load('posts.comments');

$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // true

 

Este cambio aparentemente pequeño elimina la inconsistencia entre cómo cargamos y verificamos las relaciones, haciendo que nuestro código sea más intuitivo y menos propenso a errores.

 

#Ejemplo práctico

Veamos cómo esta mejora simplifica un patrón común en las aplicaciones de Laravel. Imagina que estás creando un blog con un método controlador que muestra una entrada con sus comentarios e información del autor.

Con el método relationshipLoaded() mejorado, tu código se vuelve más directo y eficiente:

 

public function show(Post $post)
{
    // Load only what we need
    $relations = [];
    
    if (!$post->relationLoaded('author')) {
        $relations[] = 'author';
    }
    
    if (!$post->relationLoaded('comments.author')) {
        $relations[] = 'comments.author';
    }
    
    if (!empty($relations)) {
        $post->load($relations);
    }
    
    return view('posts.show', compact('post'));
}

 

Este enfoque evita consultas de base de datos innecesarias al cargar únicamente las relaciones que aún no están cargadas, lo que mejora el rendimiento de su aplicación.

Antonio Jenaro

Desarrollador backend especializado en PHP y Laravel, con sede en Santander, Cantabria. Más de 15 años de experiencia en el desarrollo de aplicaciones web a medida y en la modernización de código heredado.

Archivado en:

Fuente: Harris Raftopoulos

Artículos relacionados

Simplificación de consultas con relaciones con el método whereAttachedTo de Laravel
269

Simplificación de consultas con relaciones con el método whereAttachedTo de Laravel

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión