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

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

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

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

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