php - relaciones - uno a muchos en laravel
Salvar la relaciĆ³n uno a uno en Laravel (3)
Estás haciendo mal aquí
$company = new Company();
$company->name = ''Test'';
User::findOrFail(1)->company()->save($company);
No estás diciendo qué fila actualizar
Entonces tu código debe ser modificado así
$companyId
es su empresa para actualizar
$company = new Company();
$company->name = ''Test'';
User::findOrFail(1)->company()->find($companyId)->save($company);
Un User
tiene una (o cero) Company
y una Company
pertenece a un solo User
. Intento guardar una empresa para un usuario, pero agrega una nueva entrada en la base de datos cada vez que vuelvo a activar el método de guardar. Es una relación uno a uno, así que pensé en save
método en User
.
So Company
tiene un método user()
:
public function user() {
return $this->belongsTo(User::class, ''user_id'');
}
Y el User
tiene una company()
método company()
:
public function company() {
return $this->hasOne(Company::class, ''user_id'');
}
Estoy intentando guardar (así crear o actualizar) una compañía de usuario como esta (en un Controlador):
$company = new Company();
$company->name = ''Test'';
User::findOrFail(1)->company()->save($company);
La primera vez que ejecuto este código crea la entrada en la base de datos (OK), pero por segunda vez agrega una nueva entrada para el mismo usuario (No está bien). Pensé que solo actualizaría la entrada de la base de datos.
¿Es un problema técnico (o algo que no entiendo en una relación de uno a uno) en Laravel o estoy haciendo algo mal? (Creo que espero que sea el segundo objetivo)
La creación y actualización necesitan tratarse de manera diferente. Entonces, primero verifique la existencia del atributo de la compañía.
$user = User::with(''company'')->findOrFail(1);
if ($user->company === null)
{
$company = new Company([''name'' => ''Test'']);
$user->company()->save($company);
}
else
{
$user->company->update([''name'' => ''Test'']);
}
Tenga en cuenta que hasOne()
no garantiza que tendrá una relación de uno a uno, solo le dice a Eloquent cómo crear una consulta. Funciona incluso si tiene varias Company
refieren al mismo User
, en tal caso cuando llame a $user->company
obtendrá la primera Company
en el conjunto de datos de resultados de la base de datos.
$user = User::findOrFail(1);
$company = $user->company ?: new Company;
$company->name = ''Test'';
$user->company()->save($company);