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.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étodoprofile en el modelo User.
profiles contiene la columna user_id.
Obtener los datos relacionados
Puedes acceder a la relación como si fuera una propiedad.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
_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
comments contiene la columna post_id.
Obtener los datos relacionados
Una relaciónhasMany devuelve una colección.
Relación inversa (belongsTo)
Para acceder al post desde un comentario, definebelongsTo 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, unPost tiene varios Tag y cada Tag pertenece a varios Post.
Estructura de tablas
Muchos a muchos requiere una tabla intermedia. ParaPost 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 + tag → post_tag).Definir la relación
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.
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.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.
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.Próximos pasos
Introducción a Eloquent
Repasa las operaciones CRUD básicas de Eloquent.