刷新关系而不重新加载模型

时间:2017-11-09 00:32:20

标签: php laravel

我遇到这种情况:

1. $ model = Model :: where(someCondition);

在上面的代码之后我对$ model子关系做了一些更新,模型有设置关系,所以我更新它们并将它们保存到db。

然后我稍后尝试访问$ model->设置,我只得到上面的时间(1)的设置,而不是我刚刚添加并保存到db的所有设置。

我发现自己必须在对设置进行一些更新后再次执行此操作,以便加载已添加到db表的新设置。

所以我重复这一行 $ model = Model :: where(someCondition);

能够执行此$ model->设置并从db获取新数据。

这是必须如何完成的,还是有办法刷新关系,以便从db获取最新数据,而不是使用我第一次创建模型时的数据?

希望你理解我的意思。

这里有一些代码:

    $tBlock = TemplateBlock::set($template_id, $blockData, $parentId);

    // remove settings from db that have default values
    foreach ($tBlock->getSettingsNoDefaults() as $baseKey => $value) {
        if(!array_key_exists($baseKey, $blockData->settings)) {
            $tBlock->removeSetting($baseKey);
        }
    }

    // only save settings that have been customized by user
    foreach ($blockData->settings as $key => $setting) {
        $tBlock->setSetting($key, $setting['value'], $setting['type']);
    }

    // refresh the block so we get latest settings
    $tBlock = TemplateBlock::where('tblock_id', $template_id);
    $settings = $tBlock->settings;

setSetting函数如下所示:

public function setSetting($key, $value, $type = 'string')
{
    $setting = $this->settings()->updateOrCreate(
        ['key' => $key],
        ['key' => $key, 'value' => $value, 'type' => $type]
    );

    return true;
}

注意我必须通过以下方式再次获得tBlock:

$tBlock = TemplateBlock::where('tblock_id', $template_id);

它给了我我追求的东西,但它感觉如此不优雅,有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

$model->load('relationship')会懒得急切地加载这段关系。

Docs 5.4 - Eloquent - Relationships - Eager loading