gajosu / eloquent-preferences
Laravel Eloquent 模型的偏好设置
Requires
- ext-json: *
- illuminate/database: ~8.0|^9.0
- illuminate/support: ~8.0|^9.0
Requires (Dev)
- ext-pdo: *
- friendsofphp/php-cs-fixer: ^3.8
- illuminate/events: ~8.0|^9.0
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- phpunit/phpunit: ~5.0|~4.8|^9.5.10
- dev-master
- v1.0.2
- v1.0.1
- v1.0.0
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.0
- v0.2.0
- v0.1.1
- v0.1.0
- v0.0.5
- v0.0.4
- v0.0.3
- v0.0.2
- v0.0.1
- dev-dependabot/github_actions/stefanzweifel/git-auto-commit-action-5
- dev-dependabot/github_actions/actions/checkout-4
- dev-support-cache-without-tags
- dev-cache-module
- dev-l9-compatibility
This package is auto-updated.
Last update: 2024-09-09 03:39:45 UTC
README
使用此库将多个键/值对偏好绑定到应用程序的 Eloquent 模型。偏好存储在应用程序的数据库中,因此可以轻松存储和查询。此库支持 Eloquent 5 至 8 版本,无论是独立安装还是作为完整 Laravel 框架的一部分。欢迎提交问题和拉取请求!有关更多信息,请参阅 CONTRIBUTING.md。
安装
运行 composer require gajosu/eloquent-preferences
下载并安装库。
Laravel 中配置
- 将
EloquentPreferencesServiceProvider
添加到config/app.php
// ... return [ // ... 'providers' => [ // ... Gajosu\EloquentPreferences\EloquentPreferencesServiceProvider::class, ], // ... ];
- 安装配置和数据库迁移文件
$ php artisan vendor:publish
-
默认情况下,模型偏好存储在 "model_preferences" 数据库表中。如果您想使用不同的表,请编辑
config/eloquent-preferences.php
中的 "table" 条目。 -
安装模型偏好数据库
$ php artisan migrate
非 Laravel 中配置
-
默认情况下,模型偏好存储在 "model_preferences" 数据库表中。如果您想使用不同的表,请定义项目入口点的
MODEL_PREFERENCE_TABLE
常量,使用您首选的表名。 -
安装模型偏好数据库。有几种方法可以在 Laravel 之外安装它。以下是应用此模式的模式蓝图
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Schema\Blueprint; use Gajosu\EloquentPreferences\Preference; // ... Model::getConnectionResolver() ->connection() ->getSchemaBuilder() ->create((new Preference)->getQualifiedTableName(), function (Blueprint $table) { $table->increments('id'); $table->string('preference'); $table->string('value'); $table->morphs('preferable'); $table->timestamps(); });
启用缓存
默认情况下禁用缓存,要启用它,请编辑 config/eloquent-preferences.php
中的 "cache.enabled" 条目,将值更改为 true
,您还可以指定缓存前缀
'cache' => [ 'enabled' => true, 'prefix' => 'eloquent-preferences', ]
用法
将 HasPreferences
特性添加到您希望有相关偏好的 Eloquent 模型中。
use Gajosu\EloquentPreferences\HasPreferences; // ... class MyModel extends Model { use HasPreferences; // ... }
这创建了一个多态的 has-many 关系,称为 "preferences",您可以在模型上像查询任何其他 Eloquent 关系一样查询它。模型偏好由 Gajosu\EloquentPreferences\Preference
类建模。偏好对象具有 preference
、value
和 Eloquent 内置的 created_at
和 updated_at
属性。《HasPreferences》特性可以在应用程序中的任何数量的模型类中使用。
// Retrieving preferences via Eloquent /** @var Gajosu\EloquentPreferences\Preference $myPreference */ $myPreference = MyModel::find($someId)->preferences()->where('preference', 'my-preference')->get(); // Saving preferences via Eloquent $preference = new Preference; $preference->preference = 'some preference'; $preference->value = 'some value'; $myModel->preferences()->save($preference);
可以直接在 Preference
类上运行 Eloquent 查询。
/** @var Illuminate\Database\Eloquent\Collection|Gajosu\EloquentPreferences\Preference[] $preferences */ $preferences = Preference::whereIn('preference', ['foo', 'bar'])->orderBy('created_at')->get();
辅助方法
HasPreferences
特性提供了一些辅助方法,使偏好管理变得更加容易。
检索偏好
调用 getPreference($preferenceName)
或 prefers($preferenceName)
方法来检索该偏好值。
$numberOfFoos = $myModel->getPreference('number-of-foos'); $myModel->prefers('Star Trek over Star Wars') ? liveLongAndProsper() : theForceIsWithYou();
设置偏好
调用 setPreference($name, $value)
或 setPreferences($arrayOfNamesAndValues)
方法来设置模型偏好值。设置偏好会创建新的偏好行(如果偏好不存在)或更新现有偏好的新值。
$myModel->setPreference('foo', 'bar'); $myModel->setPreferences([ 'foo' => 'bar', 'bar' => 'baz', ]);
删除偏好
调用 clearPreference($preferenceName)
、clearPreferences($arrayOfPreferenceNames)
或 clearAllPreferences()
方法来从模型中删除一个、多个或所有偏好。清除偏好会从偏好表中删除它们的相关行。
$myModel->clearPreference('some preference'); $myModel->clearPreferences(['some preference', 'some other preference']); $myModel->clearAllPreferences();
默认偏好值
默认情况下,getPreference()
和 prefers()
在偏好未存储在数据库中时返回 null
。有两种方法可以声明默认偏好值
- 使用可选的第二个参数到
getPreference()
和prefers()
定义每个调用的默认值。如果偏好未存储在数据库中,则返回默认值。
// $myPreference = 'some default value' $myPreference = $myModel->getPreference('unknown preference', 'some default value');
- 通过在你的模型中声明一个包含偏好名称及其默认值的键/值对的受保护数组
$preference_defaults
来避免在每次调用getPreference()
和prefers()
时都要求额外的参数。如果偏好未存储在数据库中但定义在$preference_defaults
中,则返回$preference_defaults
中的值。如果这些都不存在,则返回可选默认值参数或null
。
class MyModel extends Model { use HasPreferences; // ... protected $preference_defaults = [ 'my-default-preference' => 'my-default-value', ]; } // ... // $myPreference = 'my-default-value' $myPreference = $myModel->getPreference('my-default-preference'); // $myPreference = 'fallback value' $myPreference = $myModel->getPreference('my-unstored-preference', 'fallback value');
请注意,默认偏好值仅在调用 getPreference()
和 prefers()
方法时适用。当通过 Eloquent 查询检索偏好时,不会尊重默认值。
偏好值转换
偏好以字符串形式存储在数据库中,但在检索时可以转换为不同的类型。
在你的模型中声明一个包含偏好名称及其值的类型转换键/值对的受保护数组 $preference_casts
。偏好存储和转换遵循与 Eloquent 的属性类型转换 相同的规则。
class MyModel extends Model { use HasPreferences; // ... protected $preference_casts = [ 'boolean-preference' => 'boolean', 'floating-point-preference' => 'float', 'date-preference' => 'date', ]; }
与默认值一样,当使用 getPreference()
、prefers()
、setPreference()
和 setPreferences()
辅助方法时,才会执行偏好转换。
隐藏偏好属性
默认情况下,所有偏好模型属性在导出为 JSON 时都是可见的。但是,可以声明隐藏属性,其行为与 Eloquent 的隐藏属性 相同。有两种方法可以声明要隐藏的偏好属性
- 如果在这个库中使用 Laravel 项目,则在
config/eloquent-preferences.php
中的 "hidden-attributes" 键中声明隐藏属性。
return [
// ...
'hidden-attributes' => ['created_at', 'updated_at'],
// ...
];
- 如果在这个库的外部使用 Laravel 框架,则在项目的入口点定义
MODEL_PREFERENCE_HIDDEN_ATTRIBUTES
常量,并使用逗号分隔要隐藏的属性列表,以便从 JSON 导出中隐藏。
const MODEL_PREFERENCE_HIDDEN_ATTRIBUTES = 'created_at,updated_at';