with relaciones relacion muchos hasone belongsto php laravel eloquent

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);