Las tablas de una base de datos a menudo están relacionadas unas con otras. Por ejemplo, un usuario puede estar asociado a una profesión y una profesión puede tener muchos usuarios asociados. Utilizando el ORM Eloquent podemos hacer que este proceso sea mucho más fácil, trabajando con las relaciones directamente dentro de nuestros modelos (usando Programación Orientada a Objetos) y creando métodos personalizados que nos evitarán tener que construir consultas de forma manual.
Repositorio
Ver el código de esta lección en GitHub
Notas
Relaciones «Pertenece a»
El método belongsTo
nos permite trabajar con relaciones donde un registro pertenece a otro registro. Este método acepta como primer argumento el nombre de la clase que queremos vincular. Eloquent determina el nombre de la llave foránea a partir del nombre del método (en este caso profession
) y agregando el sufijo _id
a este:
public function profession() { return $this->belongsTo(Profession::class); }
Si en tu base de datos el nombre de la llave foránea no sigue esta convención puedes pasar el nombre de la columna como segundo argumento:
public function profession() { return $this->belongsTo(Profession::class, 'id_profession'); }
Por otro lado, si el modelo padre no usa una columna id como su llave primaria o quieres relacionar el modelo a una columna diferente, puedes pasar un tercer argumento especificando el nombre de la columna que actuaría como llave del modelo padre:
public function profession() { return $this->belongsTo(Profession::class, 'profession_name', 'name'); }
En este caso Eloquent buscará la relación entre la columna profession_name
del modelo Users y la columna name
del modelo Profession.
Hecho esto, utilizando cualquiera de las formas anteriores, podemos obtener la profesión del usuario:
$user = User::first(); $user->profession;
Relaciones uno a muchos con hasMany
Una relación uno a muchos es utilizada cuando un modelo puede tener muchos otros modelos relacionados. Por ejemplo, una profesión puede tener un número indeterminado de usuarios asociados a ésta. Dentro del modelo Profession
podemos decir que una profesión tiene muchos usuarios:
public function users() { return $this->hasMany(User::class); }
Ahora podemos obtener todos los usuarios de una profesión:
$profession = Profession:first(); $profession->users;
Los métodos que nos permiten relacionar un modelo con muchos otros siempre van a retornar una colección, así esté vacía y los métodos que nos permiten relacionar un modelo con otro van a retornar el modelo o null
.
Construir consultas
Podemos construir una consulta llamando al método de una relación. Por ejemplo, encadenando el método where()
a users()
podemos obtener todos los usuarios asociados a una profesión pero que tengan la columna is_admin
como true:
$profession->users()->where('is_admin', true)->get();
Material relacionado
- Relacionar objetos con el ORM Eloquent
- Curso de programación orientada a objetos con PHP
- Documentación oficial de Laravel
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Manejo de atributos en Eloquent ORM (solución a MassAssignmentException) Lección siguiente Generar registros usando Model Factories en Laravel