当我更新关系时,例如更新Child上的parent_id(Child belongsTo Parent,Parent hasMany Child)并使用Child-> Parent对象进行响应,不知何故返回的Parent仍然是旧的。我认为这是因为当时已经加载了Parent。
我现在希望 unlaod 这些关系,以便再次从db中获取新的Parent。
有没有办法卸载加载的关系?就像你可以通过使用model-> load('relation')来延迟加载,你还可以再次卸载它吗?
非常感谢!
答案 0 :(得分:13)
卸载关系可以通过将空数组传递给模型
来完成$child->setRelations([]);
在此之后调用模型上的关系时,它将在那时重新加载。
..至少在当前版本(5.x)中,可能不是在你的问题时:)
答案 1 :(得分:10)
您可以通过取消设置魔法属性来卸载关系(至少在Laravel 5.3及更高版本中)。
用法:
unset($model->relation);
使这项工作的原因(来自Model类):
public function __unset($key)
{
unset($this->attributes[$key], $this->relations[$key]);
}
它与$model->setRelations([])
相同,但是对于特定关系(而不是卸载所有关系)。
答案 2 :(得分:4)
load
没有允许卸载关系的对应物。
但是,要从数据库重新加载关系,您只需再次调用load
$parent = $child->load('relation');
// change parent_id
$parent = $child->load('relation');
我很快就看到了laravel的来源,并没有发现某种缓存的暗示。所以它只是执行一个新的查询再次获取关系。
感谢@Jarek Tkaczyk确认我的假设
答案 3 :(得分:0)
从Laravel 5.6开始,有一个unsetRelation(string)
函数。
$parent->load('child');
$parent->unsetRelation('child');
如果您只是想取消单个关系,而不是通过$parent->setRelationships([])
删除所有关系,那么我认为这提供了更多的可读性。