保存一个归属关系

时间:2019-11-28 15:21:31

标签: php laravel eloquent relationship laravel-6

我有一个经典的一对多关系,我正在尝试保存belongsTo方面的模型。

这两个模型具有以下关系:

// Model myModel
function domicile()
{
    return $this->belongsTo('App\Address', 'domicile_id');
}

// Model Address
function myModels()
{
    return $this->hasMany('App\MyModel', 'domicile_id');
}

这是我要保存的工作:

$myModel->domicile()->save($my_array);

使用此代码,我得到错误:

  

调用未定义的方法Illuminate \ Database \ Eloquent \ Relations \ BelongsTo :: save()

如果我使用此代码(不带括号):

$myModel->domicile->save($my_array);

我没有收到任何错误,但是没有保存模型。
我知道有一种方法associate,但是我需要更新一个现有记录,而不是保存一个新记录。

3 个答案:

答案 0 :(得分:1)

除了保存save函数外,还必须使用fill函数来保存belongsTo关系。

通过这种方式:

$myModel->domicile->fill($my_array);
$myModel->domicile->save();

答案 1 :(得分:1)

您必须使用 associate() + save() 来存储 BelongsTo 关系:

$myModel->domicile()->associate($domicile);
$myModel->save();

Laravel Docs

答案 2 :(得分:0)

因为$myModel->domicile()->save($my_array);$myModel->domicile->save($my_array);完全不同:

  1. $myModel->domicile()将产生一个BelongsTo对象,不支持save,因为saveHasMany实例的方法,而对于您应使用BelongsTo

  2. associate(YourModel)实例
  3. $myModel->domicile将产生关联元素的Model对象,该对象支持save(array)方法,但是该数组是options数组,如api所说https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Model.html#method_save

换句话说,如果您具有一个(地址)与多个(住所)的关系,并且要与一个或多个住所关联,则必须使用save或{{1} }(https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Relations/HasMany.html#method_save),如果要与住所地址关联,则应使用saveManyhttps://laravel.com/api/5.7/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate)...请记住,如果要这样做,您应该使用方括号调用属性,以便返回associate对象或HasMany对象,而不是模型或集合(如果不使用方括号调用属性,则会得到模型或集合) )