我有一个经典的一对多关系,我正在尝试保存属于一方的模型。
这两个模型具有以下关系:
// Model myModel
function domicile()
{
return $this->belongsTo('AppAddress', 'domicile_id');
}
// Model Address
function myModels()
{
return $this->hasMany('AppMyModel', 'domicile_id');
}
这就是我试图拯救它的方法:
$myModel->domicile()->save($my_array);
使用此代码,我得到错误:
调用未定义的方法 Illuminate\Database\Eloquent\Relations\BelongsTo::save((
如果我使用此代码(不带括号(:
$myModel->domicile->save($my_array);
我没有收到任何错误,但模型未保存。
我知道有方法associate
,但我需要更新现有记录,而不是保存新记录。
因为$myModel->domicile()->save($my_array);
与$myModel->domicile->save($my_array);
完全不同:
-
$myModel->domicile()
将生成一个BelongsTo
对象,不支持save
,因为save
是一种HasMany
实例的方法,相反,对于BelongsTo
实例,您应该使用associate(YourModel)
-
$myModel->domicile
将生成关联元素的Model
对象,该对象支持save(array)
方法,但该数组是一个options
数组,如 API 所述 https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Model.html#method_save
所以换句话说,如果你有一个(地址(对多(住所(的关系,如果你想与一个或多个住所的地址相关联,你必须使用save
或saveMany
(https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Relations/HasMany.html#method_save(,相反,如果你想与一个住所关联一个地址,你应该使用associate
(https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate(...请记住,如果要执行此操作,则应使用括号调用属性,以便返回HasMany
对象或BelongsTo
对象,而不是模型或集合(如果调用不带括号的属性,则会得到(
而不是使用save
函数,为了保存属于关系,你必须使用fill
函数。
这样:
$myModel->domicile->fill($my_array);
$myModel->domicile->save();
必须使用associate()
+save()
才能存储 BelongsTo 关系:
$myModel->domicile()->associate($domicile);
$myModel->save();
查看拉拉维尔文档