快速开始
要求
- PHP 8.3 或更高版本。
- Laravel 12 或 13。
安装软件包
composer require dragon-code/laravel-model-settings
Laravel 会自动发现此软件包的服务提供者。
发布配置和迁移,然后创建设置表:
php artisan vendor:publish --tag="model_settings"
php artisan migrate
model_settings 标签会发布 config/model_settings.php 和软件包迁移。默认迁移使用应用程序的默认数据库
连接创建 settings 表。
添加 trait
将 HasSettings 添加到每个需要设置的 Eloquent 模型:
namespace App\Models;
use DragonCode\LaravelModelSettings\Concerns\HasSettings;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasSettings;
}
此 trait 添加以下公共方法:
| 方法 | 用途 |
|---|---|
settings() | 读取或修改一个已保存模型的最终设置 |
defaultSettings() | 读取或修改模型类的默认值 |
modelSettings() | 用于预加载的 Eloquent 关联 |
保存第一个设置
为所有已保存的 User 模型创建默认值:
(new User)->defaultSettings()->set('timezone', 'UTC');
为一个已保存用户覆盖该值:
$user = User::query()->firstOrFail();
$user->settings()->set('timezone', 'Europe/Paris');
assert($user->settings()->get('timezone') === 'Europe/Paris');
将所有最终设置读取为按设置名称索引的集合:
$settings = $user->settings()->all();
assert($settings->get('timezone') === 'Europe/Paris');
删除覆盖值以重新使用 UTC:
$user->settings()->forget('timezone');
assert($user->settings()->get('timezone') === 'UTC');
先保存模型
只有在父模型保存后才能调用 settings()->set()、setMany()、forget()、forgetMany() 和 purge()。
对于未保存的模型,即使类默认值存在,settings()->get() 也会返回 null,settings()->has() 返回
false,settings()->all() 会返回空集合。每个修改方法都会在执行存储查询前抛出
DragonCode\LaravelModelSettings\Exceptions\InvalidSettingsOwnerException。