在拉拉维尔保存一对一的关系

2022-08-30 17:24:38

A 有一个(或零),而 a 属于一个且只有一个。我尝试为用户保存公司,但每次重新触发保存方法时,它都会在数据库中添加一个新条目。这是一个一对一的关系,所以我虽然方法在.UserCompanyCompanyUsersaveUser

所以有一种方法:Companyuser()

public function user() {
    return $this->belongsTo(User::class, 'user_id');
}

并且有一种方法:Usercompany()

public function company() {
    return $this->hasOne(Company::class, 'user_id');
}

我正在尝试保存(因此创建或更新)用户的公司,如下所示(在控制器中):

$company = new Company();
$company->name = 'Test';
User::findOrFail(1)->company()->save($company);

第一次运行此代码时,它会在数据库中创建条目(OK),但第二次它会为同一用户添加一个新条目(不OK)。我以为它只会更新数据库条目。

这是Laravel中的故障(或者我在一对一的关系中不理解的东西)还是我做错了什么?(我认为并希望这是第二个目的)


答案 1

创建和更新需要区别对待。因此,首先检查公司属性是否存在。

$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']);
}

请注意,并不能保证您将拥有一对一的关系,它只是告诉Eloquent如何创建查询。它的工作原理,即使你有多个引用同一个,在这种情况下,当你调用时,你将从数据库中得到第一个结果数据集。hasOne()CompanyUser$user->companyCompany


答案 2
$user = User::findOrFail(1);
$company = $user->company ?: new Company;
$company->name = 'Test';
$user->company()->save($company);

推荐