setting->whereIn('name', $names)->pluck('name'); //only insert settings that don't already exist in database $new = array_filter($defaultSettings, function ($setting) use ( $existing, ) { return !$existing->contains($setting['name']); }); $this->setting->insert($new); $this->mergeMenusSetting($defaultSettings); } /** * Merge existing menus setting json with new one. */ private function mergeMenusSetting(array $defaultSettings): void { $existing = $this->setting->where('name', 'menus')->first()->value ?? []; $new = json_decode( Arr::first( $defaultSettings, fn($value) => $value['name'] === 'menus', )['value'], true, ); foreach ($new as $newMenu) { $alreadyHas = Arr::first( $existing, fn($value) => $value['name'] === $newMenu['name'], ); foreach ($newMenu['items'] as $index => $item) { $newMenu['items'][$index]['order'] = $index; } if (!$alreadyHas) { $existing[] = $newMenu; } } $this->setting ->where('name', 'menus') ->update(['value' => json_encode($existing)]); } }