-
Notifications
You must be signed in to change notification settings - Fork 111
Open
Description
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();pandeydip
Metadata
Metadata
Assignees
Labels
No labels