elhareth/laravel-eloquent-metable

一个用于扩展 Laravel Eloquent 模型数据的包

v1.0.0 2023-11-13 22:22 UTC

This package is auto-updated.

Last update: 2024-09-14 00:44:16 UTC


README

Laravel-Eloquent-Metable 是一个包,用于扩展 Laravel Eloquent 模型而不会打乱数据库模式。

示例用法

向 Eloquent 模型添加元数据

$user = User::create([
    'name' => 'User Name',
    'email' => 'username@email.com',
    'password' => 'password',
]);
$user->setMeta('gender', 'male');

查询范围以按其元数据获取模型

$user = User::whereMeta('gender', 'male');

获取附加的元数据

$gender = $user->getMeta('gender');

安装

使用 composer 将包添加到您的 Laravel 应用中

composer require elhareth/laravel-eloquent-metable

运行迁移以将所需的表添加到数据库中。

php artisan migrate

Elhareth\LaravelEloquentMetable\IsMetable 特性添加到您希望能够附加元数据的任何 Eloquent 模型类中。

use Illuminate\Database\Eloquent\Model;
use Elhareth\LaravelEloquentMetable\IsMetable;

class User extends Model
{
    use IsMetable;
}

文档

处理元数据

IsMetable 特性将为您的模型添加 metalist() 方法,该方法用于处理您的模型与元数据模型 Metable 之间的关系。

附加元数据

使用 setMeta() 方法将元数据附加到模型。该方法接受三个参数:用作元数据名称的字符串、值以及可选的组字符串。值参数可以接受多种输入,这些输入将被转换为字符串以存储在数据库中。

 $user->setMeta('key', 'value');
 $user->setMeta('key', 'value', null);
 $user->setMeta('key', 'value', 'group');

如果您想添加多个元记录,可以将数组作为第一个参数传递

 $user->setMeta([
    'full_name' => 'Full Name',
    'gender' => 'male',
    'bio' => 'Lorem absum...',
 ]);

您还可以传递第二个参数作为元数据组

 $user->setMeta([
    'full_name' => 'Full Name',
    'gender' => 'male',
    'bio' => 'Lorem absum...',
 ], 'profile');

注意!

如果您添加的元记录的值为数组类型,并且它有值/组键,则它将被视为 $value / $group 参数,因此当您添加可能包含这些键的数组时,请考虑使用将值参数视为值无论其包含什么的方法 setMeta()

 $user->setMeta('key', [
    'value' => 'random-content',
 ]); // 'a:1:{s:5:"value";s:14:"random-content";};'
 $value = $user->getMeta('key'); // ['value' => 'random-content']

检索元数据

您可以使用 getMeta() 方法检索给定键的元数据值。

 $gender = $user->getMeta('gender');

getMeta 方法接受三个参数;getMeta(name: $name, default: $default nullable $nullable) 第一个是元记录的名称,第二个参数指定如果没有在给定键设置元数据则返回的默认值。第三个参数是一个布尔值,用于设置是否将空值视为未找到。

 $user->getMeta('gender', 'male'); // will return 'male' if not set
 $user->getMeta('gender', 'male', false); // will return male if not set or if value is null
 $user->getMeta('gender', 'male', true); // will return male if not set or null if is set to null

您可以根据特定的组检索元数据集合

 $profile = $user->getMetaGroup('profile'); // return collection

检查元数据的存在性

您可以使用 hasMeta() 方法检查是否已将值分配给给定的键。如果数据库中找到了记录,该方法将返回 true。您还可以传递另一个布尔值以控制如何处理空值。

 if ($user->hasMeta('gender')) {
    // ...
 }

 if ($user->has(name: 'gender', nullable: true)) {
    // ...
 }

队列元数据

您可以批量分配元数据,它们将在模型创建后附加。

 $user = User::create([
    'name' => 'UserName',
    'email' => 'username@email.com',
    'password' => 'password',
    'metables' => [
        'gender' => 'male', // OR
        'gender' => [
            'value' => 'male', // OR
        ],
        'gender' => [
            'value' => 'male',
            'group' => 'profile', // If not specified group is null
        ],
    ],
 ]);

 $user->getMeta('gender') // male

预元数据

您可以为每个模型定义默认的元数据,它们将在模型创建时添加。

为此,您应该实现 Elhareth\LaravelEloquentMetable\IsMetableInterface> 并定义一个方法 defaultMetables(),该方法返回您想要自动附加到模型上的元数据数组。

 use Elhareth\LaravelEloquentMetable\IsMetableInterface;
 use Illuminate\Database\Eloquent\Model;
 
 class User extends Model implements IsMetableInterface
 {
    /**
     * Default Metables
     * 
     * @return array
     */
    protected function defaultMetables(): array
    {
        return [
            'gender' => [
                'value' => null,
                'group' => 'profile',
            ],
            'bio' => [
                'value' => null,
                'group' => 'profile',
            ],
            'locale' => [
                'value' => 'en',
                'group' => null,
            ],
            'avatar' => [
                'value' => 'avatar.png',
            ],
            'theme' => 'dark',
        ];
    }
 }

您可以通过 getDefaultMetables() 获取模型默认元数据的列表。

删除元数据

要删除存储在给定键中的元数据,请使用 removeMeta()

 $user->removeMeta('bio');

要删除模型中的所有元数据记录,请使用 deleteMetaRecords()

 $user->deleteMetaRecords();

当手动删除 IsMetable 模型时,附加的元数据将自动从数据库中清除。如果通过查询构建器删除模型,则 Metaable 不会级联。

 $user->delete(); // will delete attached meta
 User::where(...)->delete() // will NOT delete attached meta

预加载元数据

在与IsMetable模型的集合一起工作时,请确保一起预加载所有实例的元关系,以避免重复的数据库查询(即N+1问题)。

从查询构建器中预加载

 $users = User::with('metalist')->where(...)->get();

从Eloquent集合中懒式预加载

 $users->load('metalist');

您还可以指导您的模型类始终预加载元关系,通过将'metalist'添加到模型属性$with中。

 class User extends Model {
     use IsMetable;
 
     protected $with = ['metalist'];
 }

查询元数据

IsMetable特性提供了一系列查询作用域,以方便根据附加到您模型的元数据修改查询

检查键的存在性

要仅返回分配了特定键值的记录,您可以使用whereHasMeta()。您也可以向此方法传递一个数组,这将导致查询返回附加到提供的键之一或多个的任何模型。

 $users = User::whereHasMeta('gender')->get();
 $users = User::whereHasMeta(['gender', 'bio'])->get();

您还可以使用whereDoesntHaveMeta()查询不包含元键的记录。它的签名与whereHasMeta()相同。

 $users = User::whereDoesntHaveMeta('gender')->get();
 $users = User::whereDoesntHaveMeta(['gender', 'bio'])->get();

您可以根据元键中存储的值来限制查询。可以使用whereMeta()方法使用Laravel查询构建器的where()方法接受的任何运算符来比较值。

 $users = User::whereMeta('letters', ['a', 'b', 'c'])->get();

还提供了whereMetaIn()方法,可用于查找值与预定义选项集中的某个选项匹配的记录。

 $users = User::whereMetaIn('country', ['CAN', 'USA', 'MEX']);

许可证

此软件包在MIT许可证(MIT)下发布。