dragon-code/laravel-model-settings

Model Settings for your Laravel application

Maintainers

Package info

github.com/TheDragonCode/laravel-model-settings

Homepage

Language:Python

pkg:composer/dragon-code/laravel-model-settings

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-07-07 23:15 UTC

This package is auto-updated.

Last update: 2026-07-07 23:15:19 UTC


README

model settings

Stable Version Total Downloads License

Store settings for individual Eloquent models, with optional defaults shared by models of the same type.

Use this package when each model needs its own settings, but should fall back to shared values when a model value is missing.

Installation

Install the package via Composer:

composer require dragon-code/laravel-model-settings

Publish the config and migration, then run migrations:

php artisan vendor:publish --tag="model-settings"
php artisan migrate

Quick Start

Add the HasSettings trait to a model:

use DragonCode\LaravelModelSettings\Concerns\HasSettings;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasSettings;
}

Use settings on a saved model:

$user = User::query()->findOrFail(123);

$user->settings()->set('timezone', 'UTC');
$user->settings()->set('notifications', ['email' => true]);

$user->settings()->get('timezone');      // 'UTC'
$user->settings()->get('notifications'); // ['email' => true]
$user->settings()->get('missing');       // null

$user->settings()->all();                // Illuminate\Support\Collection

$user->settings()->forget('timezone');
$user->settings()->get('timezone');      // null

Default Settings

Default settings are fallback values shared by models of the same type:

$defaults = (new User)->defaultSettings();

$defaults->set('timezone', 'UTC');
$defaults->set('locale', 'en');

$defaults->get('timezone'); // 'UTC'
$defaults->all();           // Illuminate\Support\Collection
$defaults->forget('locale');

Model values override defaults. Removing the model value exposes the default again:

(new User)->defaultSettings()->set('timezone', 'UTC');

$user->settings()->get('timezone'); // 'UTC'

$user->settings()->set('timezone', 'Europe/Paris');
$user->settings()->get('timezone'); // 'Europe/Paris'

$user->settings()->forget('timezone');
$user->settings()->get('timezone'); // 'UTC'

Default settings are stored with the model morph class and item_id = 0.

API

Method Returns Description
all() Collection Returns defaults merged with model settings. Model values win.
get(UnitEnum|string|int $key) mixed Returns the model value, then the default value, then null.
set(UnitEnum|string|int $key, mixed $value) void Creates or updates a model setting.
forget(UnitEnum|string|int $key) void Removes a model setting.

Setting Keys

Keys can be strings, integers, or PHP enums:

enum UserSetting: string
{
    case Timezone = 'timezone';
}

$user->settings()->set(UserSetting::Timezone, 'UTC');
$user->settings()->get(UserSetting::Timezone); // 'UTC'

get() treats blank model values as missing and falls back to defaults. This includes null, an empty string, and an empty array.

Configuration

After publishing, edit config/model-settings.php:

Option Environment variable Default
model - DragonCode\LaravelModelSettings\Models\Settings::class
connection MODEL_SETTINGS_DATABASE_CONNECTION env('DATABASE_CONNECTION')
table MODEL_SETTINGS_DATABASE_TABLE settings

The migration stores settings in one table with item_type, string item_id, key, and nullable JSON payload. Each setting is unique by item_type, item_id, and key.

Testing

composer test
composer test:coverage

Contributing

Please see CONTRIBUTING for details.

Security

If you've found a bug regarding security please mail helldar@dragon-code.pro instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.