Explorar la documentación de Laravel para realizar operaciones básicas como crear, editar o eliminar registros con Eloquent puede resultar un poco confuso. Por eso, en este artículo te ofrezco un resumen claro de los métodos que debes usar según el tipo de relación en tu modelo.
1. Relación Uno a Uno (One to One)
Un usuario tiene un perfil, y un perfil pertenece a un usuario.
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
class Profile extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
Insertar con el método save
$profile = new Profile(['bio' => 'Mi biografía', 'twitter' => '@usuario']);
$user = User::find(1);
$user->profile()->save($profile);
Insertar con el método create
$user = User::find(1);
$comment = $user->profile()->create([
'bio' => 'Mi biografía',
'twitter' => '@usuario'
]);
Editar
$user = User::find(1);
$user->profile->bio = 'Nueva biografía';
$user->profile->save();
Eliminar
$user = User::find(1);
$user->profile()->delete();
2. Relación Uno a Muchos (One to Many)
class Post extends Model
{
public function comments()
{
return $this->hasMany(Comment::class);
}
}
class Comment extends Model
{
public function post()
{
return $this->belongsTo(Post::class);
}
}
Insertar
$post = Post::find(1);
$comment = new Comment(['content' => 'Este es un comentario']);
$post->comments()->save($comment);
Editar
$post = Post::find(1);
$comment = $post->comments()->find(1);
$comment->content = 'Comentario actualizado';
$comment->save();
Eliminar
$post = Post::find(1);
$comment = $post->comments()->find(1);
$comment->delete();
3. Relación Muchos a Muchos (Many to Many)
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class)
->withPivot('assigned_at');
}
}
class Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class)
->withPivot('assigned_at');
}
}
Agregar
$user = User::find(1);
$role = Role::find(1);
$user->roles()->attach($role->id);
// agregar con valor pivote
$user->roles()->attach($role->id, ['assigned_at' => now()]);
// asignar múltiples roles con valores en las columnas pivote
$user->roles()->attach([
2 => ['assigned_at' => now()],
3 => ['assigned_at' => now()->subDay()],
]);
Editar
$user = User::find(1);
$role = Role::find(1);
// Actualizar la columna 'assigned_at' para un rol específico
$user->roles()->updateExistingPivot($role->id, ['assigned_at' => now()->addDays(2)]);
// Sincronizar roles y valores en la tabla pivote
$user->roles()->sync([
2 => ['assigned_at' => now()],
3 => ['assigned_at' => now()->subDay()],
]);
Eliminar
$user = User::find(1);
$role = Role::find(1);
// Eliminar la relación del rol y el valor pivote
$user->roles()->detach($role->id);
// Eliminar varias relaciones a la vez
$user->roles()->detach([2, 3]); // Elimina los roles con id 2 y 3
attach()
para agregar nuevas relaciones.detach()
para eliminar relaciones.sync()
para actualizar todas las relaciones al mismo tiempo, eliminando las anteriores si es necesario.
Relación Muchos a Muchos con Valores Pivote
Imagina que tienes un ejemplo con User
y Role
, pero en esta ocasión, la relación entre ambos incluye una columna pivote adicional, como assigned_at
(la fecha en la que se asignó el rol al usuario).
Modelo con Tabla Pivote
En el modelo User
, debes declarar que existe una tabla pivote y que se pueden incluir valores adicionales.
// Modelo User
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class)->withPivot('assigned_at');
}
}
// Modelo Role
class Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class)->withPivot('assigned_at');
}
}
Agregar un valor en la columna pivote
Para agregar una nueva relación con un valor en la columna pivote, usas el método attach()
. Puedes pasar un array que incluya las columnas adicionales:
$user = User::find(1);
$roleId = 2;
// Asignar el rol al usuario con un valor pivote
$user->roles()->attach($roleId, ['assigned_at' => now()]);
Si necesitas asignar múltiples roles con valores en las columnas pivote:
$user->roles()->attach([
2 => ['assigned_at' => now()],
3 => ['assigned_at' => now()->subDay()],
]);
Actualizar valores en la columna pivote
$user = User::find(1);
$roleId = 2;
// Actualizar la columna 'assigned_at' para un rol específico
$user->roles()->updateExistingPivot($roleId, ['assigned_at' => now()->addDays(2)]);
Puedes actualizar varios valores al mismo tiempo utilizando un bucle o varias llamadas.
sync() con valores pivote
También puedes usar sync()
para actualizar relaciones y valores pivote al mismo tiempo. Esto reemplaza las relaciones actuales por las nuevas.
$user = User::find(1);
// Sincronizar roles y valores en la tabla pivote
$user->roles()->sync([
2 => ['assigned_at' => now()],
3 => ['assigned_at' => now()->subDay()],
]);
Eliminar valores en la columna pivote
$user = User::find(1);
$roleId = 2;
// Eliminar la relación del rol y el valor pivote
$user->roles()->detach($roleId);
Para eliminar varias relaciones a la vez:
$user->roles()->detach([2, 3]); // Elimina los roles con id 2 y 3