首页 > 解决方案 > updateOr如果我们得到null,则创建一行并跳过列更新,保留原始值

问题描述

是否有可能做到这一点?我有一个接受这些参数的函数。

第一次调用它时,它将创建由 JSON 文件定义的所有可能设置并将它们保存到数据库中。这里的重要列是 meta,它是字符串列,但保存 json 值。

一旦数据被保存到数据库中,元值就不需要再修改了,当我们想要保存时,我们不需要将它们从 UI 发送回服务器。如果 $meta 为空,下面会发生什么?它也会将元列设置为空。如果传入的值为空,是否有一种优雅的方法告诉 laravel 不要更新列,所以它保留旧值?

public function saveSetting($section, $parent, $key, $value, $type = 'string', $meta)
{
    if(is_array($value) || is_object($value)) {
        $type = 'json';
        $value = json_encode($value);
    }

    $setting = $this->settings()->updateOrCreate(
        ['theme_id' => $this->id, 'section' => $section, 'key' => $key],
        ['section' => $section, 'parent_id' => $parent, 'key' => $key, 'value' => $value, 'type' => $type, 'meta' => $meta]
    );

    return $setting;
}

现在我想到的唯一解决方案是我使用 if 来查看是否设置了 meta,如下所示:

public function saveSetting($section, $parent, $key, $value, $type = 'string', $meta)
{
    if(is_array($value) || is_object($value)) {
        $type = 'json';
        $value = json_encode($value);
    }

    if(isset($meta)) {
        $setting = $this->settings()->updateOrCreate(
            ['theme_id' => $this->id, 'section' => $section, 'key' => $key],
            ['section' => $section, 'parent_id' => $parent, 'key' => $key, 'value' => $value, 'type' => $type, 'meta' => $meta]
        );
    } else {
        $setting = $this->settings()->updateOrCreate(
            ['theme_id' => $this->id, 'section' => $section, 'key' => $key],
            ['section' => $section, 'parent_id' => $parent, 'key' => $key, 'value' => $value, 'type' => $type]
        );
    }

    return $setting;
}

有没有更好的方法来跳过更新元?

调用 saveSetting 函数的代码如下所示:

            foreach ($section as $key => $setting) {
                $theme->saveSetting($sectionKey, $sectionSetting->id, $key, $setting['value'], $setting['type'], null);
            }

meta 设置为 null,因为我们已经在数据库中有 meta,并且我们的 UI 不需要在用户按下保存时将其发送到服务器。我们只发送到服务器数据用户实际上可以修改。

标签: laravelvue.jslaravel-5eloquent

解决方案


如果我理解你的问题是正确的......你为什么不想要这样的东西?

$dataToUpdate = [
    'section' => $section,
    'parent_id' => $parent,
    'key' => $key,
    'value' => $value,
    'type' => $type
];

if ($meta) {
    $dataToUpdate['meta'] = $meta;
}

$setting = $this->settings()->updateOrCreate(
    [
        'theme_id' => $this->id,
        'section' => $section,
        'key' => $key
    ],
    $dataToUpdate
);

推荐阅读