Skip to main content

Qué es una relación

Las tablas de una base de datos suelen estar relacionadas entre sí. Por ejemplo, un post de un blog puede tener múltiples comentarios, o un pedido está asociado al usuario que lo realizó. Eloquent facilita la definición y la manipulación de esas relaciones entre tablas. Cada relación se define como un método del modelo Eloquent.
Esta página utiliza modelos concretos como User, Post, Comment y Tag a modo de ejemplo. Se asume que dichos modelos y sus tablas ya están creados.
Las principales relaciones que soporta Eloquent son:

hasOne (uno a uno)

hasOne representa una relación en la que un modelo tiene un único modelo relacionado. Por ejemplo, cuando un User tiene un Profile.

Definir la relación

Define el método profile en el modelo User.
Eloquent infiere la clave foránea a partir del nombre del modelo padre. En este caso, asume que la tabla profiles contiene la columna user_id.

Obtener los datos relacionados

Puedes acceder a la relación como si fuera una propiedad.
Al acceder al método de relación como si fuera una propiedad, Eloquent lanza automáticamente la consulta y te devuelve los datos relacionados. A esto se le llama «propiedad dinámica de relación».

belongsTo (inversa del uno a uno)

belongsTo es la relación inversa de hasOne y se define en el modelo que posee la clave foránea. Representa que Profile pertenece a User.

Definir la relación

Eloquent usa como clave foránea el nombre del método de relación con el sufijo _id (en este caso, user_id).

Obtener los datos relacionados

hasMany (uno a muchos)

hasMany es la relación más habitual: un modelo padre tiene varios modelos hijos. Por ejemplo, un Post tiene varios Comment.

Definir la relación

Eloquent asume que la tabla comments contiene la columna post_id.

Obtener los datos relacionados

Una relación hasMany devuelve una colección.
También puedes añadir condiciones a la consulta.

Relación inversa (belongsTo)

Para acceder al post desde un comentario, define belongsTo en el modelo Comment.

belongsToMany (muchos a muchos)

Usa una relación muchos a muchos cuando ambos modelos pueden estar asociados a múltiples registros del otro lado. Por ejemplo, un Post tiene varios Tag y cada Tag pertenece a varios Post.

Estructura de tablas

Muchos a muchos requiere una tabla intermedia. Para Post y Tag se prepara la tabla pivote post_tag.
Eloquent infiere el nombre de la tabla pivote uniendo alfabéticamente los nombres de los dos modelos relacionados (post + tagpost_tag).

Definir la relación

Si defines lo mismo en el modelo Tag, puedes acceder a los datos en sentido inverso.

Obtener los datos relacionados

Añadir y eliminar relaciones

attach añade un registro a la tabla pivote y detach lo elimina.
Con sync se eliminan automáticamente los registros de la tabla pivote que no estén en el array, dejando únicamente los IDs indicados como relaciones vigentes.

Eager loading

Qué es el problema N+1

Al acceder a una relación como propiedad, Eloquent lanza una consulta cada vez. A esto se le llama «lazy loading» (carga perezosa). Si accedes a una relación dentro de un bucle, se produce el problema N+1.
Con 100 posts se generarían 101 consultas en total, con el consiguiente impacto en el rendimiento.

Eager loading con with()

Con el método with() puedes obtener los datos relacionados de una sola vez, reduciendo el total a solo 2 consultas.
Solo se ejecutan estas 2 sentencias SQL:

Cargar varias relaciones a la vez

Puedes indicar varias relaciones mediante un array.

Eager loading anidado

También puedes cargar relaciones anidadas con notación de punto.
El eager loading es fundamental para evitar el problema N+1. Adopta el hábito de usar with() siempre que accedas a relaciones dentro de un bucle.

Próximos pasos

Introducción a Eloquent

Repasa las operaciones CRUD básicas de Eloquent.
Última modificación el 13 de julio de 2026