一个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的小故障(或者是我不理解的一对一关系)还是我做错了什么?(我认为并希望这是第二个目的)
3条答案
按热度按时间xyhw6mcr1#
新建和更新需要区别对待,先检查单位属性是否存在。
注意
hasOne()
并不保证你会有一对一的关系,它只是告诉Eloquent如何创建查询。即使你有多个Company
引用同一个User
,它也能工作,在这种情况下,当你调用$user->company
时,你会从数据库中得到结果数据集中的第一个Company
。yruzcnhs2#
hi3rlvi23#
我正在尝试保存(创建或更新)用户的公司
您可以使用updateOrCreate方法准确地执行此操作:
updateOrCreate
的第一个参数是空数组,因为公司id
是由hasOne
关系$user->company()
确定的。顺便说一下,我建议不要在
hasOne
关系中使用自动递增的id字段,如果您将user_id
设置为company表中的primary,那么从技术上讲,为一个用户创建重复的company行是不可能的。