gajosu/eloquent-preferences

Laravel Eloquent 模型的偏好设置

v1.0.2 2022-07-25 01:55 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

使用此库将多个键/值对偏好绑定到应用程序的 Eloquent 模型。偏好存储在应用程序的数据库中,因此可以轻松存储和查询。此库支持 Eloquent 5 至 8 版本,无论是独立安装还是作为完整 Laravel 框架的一部分。欢迎提交问题和拉取请求!有关更多信息,请参阅 CONTRIBUTING.md

安装

运行 composer require gajosu/eloquent-preferences 下载并安装库。

Laravel 中配置

  1. EloquentPreferencesServiceProvider 添加到 config/app.php
// ...

return [

    // ...

    'providers' => [

        // ...

        Gajosu\EloquentPreferences\EloquentPreferencesServiceProvider::class,
    ],

    // ...
];
  1. 安装配置和数据库迁移文件
$ php artisan vendor:publish
  1. 默认情况下,模型偏好存储在 "model_preferences" 数据库表中。如果您想使用不同的表,请编辑 config/eloquent-preferences.php 中的 "table" 条目。

  2. 安装模型偏好数据库

$ php artisan migrate

非 Laravel 中配置

  1. 默认情况下,模型偏好存储在 "model_preferences" 数据库表中。如果您想使用不同的表,请定义项目入口点的 MODEL_PREFERENCE_TABLE 常量,使用您首选的表名。

  2. 安装模型偏好数据库。有几种方法可以在 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 类建模。偏好对象具有 preferencevalue 和 Eloquent 内置的 created_atupdated_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。有两种方法可以声明默认偏好值

  1. 使用可选的第二个参数到 getPreference()prefers() 定义每个调用的默认值。如果偏好未存储在数据库中,则返回默认值。
// $myPreference = 'some default value'
$myPreference = $myModel->getPreference('unknown preference', 'some default value');
  1. 通过在你的模型中声明一个包含偏好名称及其默认值的键/值对的受保护数组 $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 的隐藏属性 相同。有两种方法可以声明要隐藏的偏好属性

  1. 如果在这个库中使用 Laravel 项目,则在 config/eloquent-preferences.php 中的 "hidden-attributes" 键中声明隐藏属性。
return [

    // ...

    'hidden-attributes' => ['created_at', 'updated_at'],

    // ...
];
  1. 如果在这个库的外部使用 Laravel 框架,则在项目的入口点定义 MODEL_PREFERENCE_HIDDEN_ATTRIBUTES 常量,并使用逗号分隔要隐藏的属性列表,以便从 JSON 导出中隐藏。
const MODEL_PREFERENCE_HIDDEN_ATTRIBUTES = 'created_at,updated_at';

原作者

此库由 Klaude 创建,并许可于 MIT 许可证