在Laravel中保存一对一关系

hlswsv35  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(124)

一个User有一个(或零个)Company,一个Company属于一个且只有一个User,我试着为一个用户保存一个公司,但是每次我重新触发保存方法时,数据库中都会增加一个新条目,这是一对一的关系,所以我在User上想到了save方法。
所以Company有一个方法user()

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

User有一个方法company()

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

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

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

第一次运行这段代码时,它会在数据库中创建条目(OK),但第二次运行时,它会为同一个用户添加一个新条目(Not OK)。我认为它只会更新数据库条目。
这是Laravel的小故障(或者是我不理解的一对一关系)还是我做错了什么?(我认为并希望这是第二个目的)

xyhw6mcr

xyhw6mcr1#

新建和更新需要区别对待,先检查单位属性是否存在。

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

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

yruzcnhs

yruzcnhs2#

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

hi3rlvi23#

我正在尝试保存(创建或更新)用户的公司
您可以使用updateOrCreate方法准确地执行此操作:

User::findOrFail(1)->company()->updateOrCreate([],['name' => 'xyz']);

updateOrCreate的第一个参数是空数组,因为公司id是由hasOne关系$user->company()确定的。
顺便说一下,我建议不要在hasOne关系中使用自动递增的id字段,如果您将user_id设置为company表中的primary,那么从技术上讲,为一个用户创建重复的company行是不可能的。

相关问题