Eloquent/Laravel:对象是对象 - >加载('关系'),例如.对象 - >卸载( '关系')?

jsp*_*hpl 8 php laravel eloquent

当我更新关系时,例如更新Child上的parent_id(Child belongsTo Parent,Parent hasMany Child)并使用Child-> Parent对象进行响应,不知何故返回的Parent仍然是旧的.我认为这是因为当时已经加载了Parent.

我现在想要取消关系,以便再次从db中获取新的Parent.

有没有办法卸载加载的关系?就像你可以通过使用model-> load('relation')来延迟加载,你还可以再次卸载它吗?

非常感谢!

Com*_*ast 13

可以通过将空数组传递给模型来完成卸载关系

$child->setRelations([]);
Run Code Online (Sandbox Code Playgroud)

当你在那之后调用模型上的关系时,它将在那时重新加载.

..至少在当前版本(5.x)中,也许不是在您的问题时:)


qua*_*kes 11

您可以通过取消设置魔法属性来卸载关系(至少在Laravel 5.3及更高版本中).

用法:

unset($model->relation);
Run Code Online (Sandbox Code Playgroud)

是什么让这项工作(来自Model类):

public function __unset($key)
{
    unset($this->attributes[$key], $this->relations[$key]);
}
Run Code Online (Sandbox Code Playgroud)

它的作用相同$model->setRelations([]),但是对于特定的关系(而不是卸载所有关系).


Gra*_*ant 6

从 Laravel 5.6 开始,有一个unsetRelation(string)函数。

$parent->load('child');

$parent->unsetRelation('child');
Run Code Online (Sandbox Code Playgroud)

我认为如果您只是想取消设置单个关系,而不是删除所有 by ,这会提供更多的可读性$parent->setRelationships([])