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

时间:2014-11-04 09:10:13

标签: php laravel eloquent

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

我现在希望 unlaod 这些关系,以便再次从db中获取新的Parent。

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

非常感谢!

4 个答案:

答案 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([])删除所有关系,那么我认为这提供了更多的可读性。