Laravel 更新或创建一行并跳过一列更新如果我们得到null,则保留原始值

Laravel 更新或创建一行并跳过一列更新如果我们得到null,则保留原始值,laravel,vue.js,laravel-5,eloquent,Laravel,Vue.js,Laravel 5,Eloquent,有可能这样做吗?我得到了一个接受这些参数的函数 第一次调用时,它将创建由JSON文件定义的所有可能设置,并将它们保存到数据库中。这里的重要列是meta,它是字符串列,但保存json值 一旦数据被保存到数据库中,就不需要再修改元数据,我们也不需要在保存时将它们从UI发送回服务器。如果$meta为空,下面会发生什么?它还将meta列设置为null。如果传入的值为null,是否有一种优雅的方法告诉laravel不要更新列,以便保留旧值 public function saveSetting($sect

有可能这样做吗?我得到了一个接受这些参数的函数

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

一旦数据被保存到数据库中,就不需要再修改元数据,我们也不需要在保存时将它们从UI发送回服务器。如果$meta为空,下面会发生什么?它还将meta列设置为null。如果传入的值为null,是否有一种优雅的方法告诉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,用户按save时,UI不需要将其发送到服务器。我们只向服务器发送数据,用户实际上可以修改。

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

$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
);

您还可以通过使用Laravel实现这一点:

公共函数存储设置($section、$parent、$key、$value、$type='string',$meta)
{
$attributes=collect([
“节”=>$section,
'parent_id'=>$parent,
“key”=>$key,
“值”=>$value,
'type'=>$type
])->when($meta,function($attributes,$meta){
返回$attributes->put('meta',$meta);
})->当(is_数组($value)| is_对象($value)时,函数($attributes)使用($value){
返回$attributes->merge([
“值”=>$value,
'type'=>'json'
]);
});
返回$this->settings()->updateOrCreate(
['theme\u id'=>$this->id',section'=>$section',key'=>$key],
$attributes
);
}

这太优雅了!