Actualizando los datos de relación en Laravel
Cuando insertamos o actualizamos datos a través del modelo de relación Eloquent, ¿cuál es el mejor enfoque a utilizar?
Ejemplo:
$user->profile->update([‘salary’ => 5000]);
vs
$user->profile()->update([‘salary’ => 5000]);
Entiendo que:
1. $user->profile() retornará la clase de relación, como Illuminate/Database/Eloquent/Relations/HasOne.
2. $user->profile retornará la clase de modelo UserProfile actual.
Recuerdo haber visto que alguien recomendaba usar $user->profile->update() en lugar de $user->profile()->update(), pero ya no puedo encontrar el artículo o el enlace de referencia.
Sin embargo, encontré que si $user->profile es nulo, podría causar un error como Call to a member function update() on null.
¿Será más fácil utilizar siempre la función de relación para actualizar?
$user->profile()->create()
$user->profile()->update()
$user->profile()->save()
$user->profile()->delete()
¿Existen situaciones en las que debamos utilizar $user->profile->save() en su lugar?
¿O se debería utilizar cuando está en una relación anidada múltiple?
$user->profile->bank()->create()
$user->profile()->bank()->create()
Actualización:
Enlace de referencia (para mi propio entendimiento):
– https://github.com/laravel/framework/issues/13568
– https://github.com/laravel/framework/issues/2536
– https://stackoverflow.com/questions/28925292/eloquent-attach-detach-sync-fires-any-event
Conclusión:
Por ahora, utilizaré el código siguiente en la aplicación, ambos desencadenarán eventos:
if ($user->bank === null) {
$user->bank()->save(new UserBankAccount($input)); // desencadena el evento creado
// $user->bank()->create($input); // desencadena el evento creado
} else {
$user->bank->update($input); // desencadena el evento actualizado
// $user->bank()->update($input); // NO desencadena el evento actualizado
}
davy.ai
Según la discusión en GitHub y Stack Overflow, se recomienda usar
$user->profile()->update()
en lugar de$user->profile->update()
. La razón es que si$user->profile
es nulo, llamar a$user->profile->update()
resultará en un error deCall to a member function update() on null
. Por otro lado,$user->profile()->update()
no lanzará un error si$user->profile
es nulo, ya que devolverá la clase de relación que tiene un métodoupdate()
.Por lo tanto, es más seguro usar
$user->profile()->update()
para evitar errores causados por relaciones nulas.Sin embargo, en situaciones donde estás creando o actualizando una relación y estás seguro de que la relación existe, puedes usar
$user->profile->save()
en lugar de$user->profile()->save()
. Esto puede ser útil en escenarios de relaciones anidadas donde deseas guardar varios modelos relacionados al mismo tiempo.En resumen, se recomienda usar
$user->profile()->update()
para evitar errores de relaciones nulas, pero puedes usar$user->profile->save()
en situaciones donde la relación existe y deseas guardar varios modelos relacionados al mismo tiempo.