Skip to content

Add support for NULL setting value to DatabaseSettingStore #171

@quallrum

Description

@quallrum

Hello,

Recently i've encountered a problem with storing null as a setting value: a new non-null value isnt stored into database if such a key already exists and have a null value.

// This will create a new setting with nullable value
settings()->set([
    'key' => null,
]);
settings()->save();

// That new value will not be stored into database, the actual value will remain "null"
settings()->set([
    'key' => 'value',
]);
settings()->save();

The cause of this problem is that DatabaseSettingStore uses the isset() function to determine if a specific key exists, but that function does not consider null values. I would suggest to use the array_key_exists() function instead:

class DatabaseSettingStore extends SettingStore
{
    protected function write(array $data): void {
        // ...

        foreach ($keys as $key) {
            if (
                array_key_exists($key, $updatedData)
                && array_key_exists($key, $persistedData)
                && (string) $updatedData[$key] !== (string) $persistedData[$key]
            ) {
                $updateData[$key] = $updatedData[$key];
            } elseif (!array_key_exists($key, $insertData)) {
                $deleteKeys[] = $key;
            }

            unset($insertData[$key]);
        }

        // ...
    }
}

A use-case for this improvement is that sometimes (my case :)) you have a single form for the project settings and some of them may not have a value (null by default) and it is handy to just save all validated settings into database, event if some values are null:

$settings = $request->validated();

settings()->set($settings);
settings()->save();

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions