melsaka/metable

Laravel 元数据包 - 简化模型元数据管理

dev-main 2023-09-06 08:52 UTC

This package is auto-updated.

Last update: 2024-09-06 11:03:10 UTC


README

通过灵活的元数据管理增强您的 Laravel 应用程序。简化您的数据结构,简化访问,轻松自定义元表。

介绍

Metable 简化了存储大量模型数据而不添加额外的数据库列。

在 Laravel 模型中管理多样化信息(如博客文章)时很有用,它避免了列的混乱,并能够高效地存储独特数据。

功能

  • 轻松的数据管理:利用获取器和设置器无缝访问、添加、编辑或删除每个模型的元数据。

  • 简化数据库结构:使用我们的高效替代方案,避免在数据库表中创建大量列的混乱。

  • 高级排序和筛选:通过根据元属性轻松排序和筛选模型记录来提升模型记录。

  • 自定义元表:轻松创建和关联自定义元表与相应的模型,提供灵活性和组织性。

  • 多才多艺的元类型:支持广泛的元类型,包括 collectionmodelobjectarrayJSONstringintegerdoublebooleannull。您的数据,您的方式!

安装

使用 Composer 需要此包

composer require melsaka/metable

在 config/app.php 中注册包的服务提供者

'providers' => [
    ...
    Melsaka\MediaFile\MetableServiceProvider::class,
    ...
];

执行迁移命令以创建元表

php artisan migrate

要将元数据功能添加到您的模型中,只需使用 Metable 特性即可

use Melsaka\Metable\Metable;

class Post extends Model
{
    use Metable;
    ...
}

可选配置

您可以使用以下命令发布元配置文件

php artisan vendor:publish --tag=metable

在此文件中,您可以自定义默认元表(默认:meta)或为特定模型指定自定义元表。

用法

现在,您可以使用 Metable 的力量来有效地管理您的数据。

在下面的示例中,我们假设 $post 变量设置为 Post::first(),其中 Post 用作示例模型。

基本方法

创建新元数据

要创建新的元数据,请在您的模型上使用 createMeta 方法

// Create a single meta entry
$post->createMeta('key', 'value');

// Alias for createMeta
$post->addMeta('key1', 'value1');

// Create multiple meta entries at once
$post->createMeta([
    'key2' => 'value2',
    'key3' => 'value3'
]);

返回:createMeta 方法在创建成功时返回 true,否则返回 false

addMeta 方法是 createMeta 的别名。

或者,您可以使用 meta 属性创建元数据

$post->meta->add('key', 'value');

更新元数据

要更新现有的元数据,请在您的模型上使用 updateMeta 方法

// Update a single meta entry
$post->updateMeta('key', 'new value');

// Alias for updateMeta
$post->editMeta('key1', 'new value1');

// Update multiple meta entries at once
$post->updateMeta([
    'key2' => 'new value 2',
    'key3' => 'new value 3'
]);

返回:updateMeta 方法在更新成功时返回 true,如果元数据不存在或更新失败,则返回 false

editMeta 方法是 createMeta 的别名。

或者,您可以使用 meta 属性更新元数据

$post->meta->edit('key', 'value');

创建或更新元数据

使用 setMeta 方法创建新元数据或更新现有元数据

// Create a new meta entry if it doesn't exist, or update if it does
$post->setMeta('key', 'value'); // Create meta

$post->setMeta('key', 'new value'); // Update meta

// Set multiple meta entries at once
$post->setMeta([
    'key1' => 'value 1',
    'key2' => 'value 2'
]);

返回:setMeta 方法在成功时返回 true;否则,返回 false

或者,您可以使用 meta 属性设置元数据

$post->meta->set('key', 'value');

// or

$post->meta->key1 = 'value';

$post->meta->key2 = 'value2';

$post->meta->save();

获取元数据

使用 getMeta 方法检索元数据

// Return the meta value or null if it doesn't exist
$post->getMeta('key');

// Return the value or a default value if it doesn't exist or is null
$post->getMeta('key', 'default value');

您还可以使用 meta 属性访问元值

 // Return the meta value
$post->meta->key;

// Return the value or a default value if it doesn't exist or is null
$post->meta->get('key', 'default value'); 

获取所有元数据

使用 getAllMeta 方法检索所有元数据作为集合

// Return a collection of all metas for this model
// If no meta data exists, an empty collection is returned
$post->getAllMeta();

// or

$post->meta->all();

删除元数据

要删除元数据,请使用deleteMeta方法

// Delete all meta data for this model
$post->deleteAllMeta();

// Or

$post->meta->deleteAll();


// Delete a specific meta entry
$post->deleteMeta('key');

// Or

$post->meta->delete('key');

您还可以使用具有相同功能的removeMeta方法。关于deleteMeta方法

// Delete a specific meta entry
$post->removeMeta('key');

检查元数据是否存在

您可以使用hasMeta方法来检查特定元数据是否存在(返回true),或使用第二个参数来确定是否接受空值(即使值为空也返回true

// Check if this model has at least one meta
$post->hasMeta();

// Check if a specific meta exists (returns true or false)
$post->hasMeta('key');

// Specify to accept null values (returns true if value is null)
$post->hasMeta('key', true);

或者,您可以使用 meta 属性设置元数据

$post->meta->has('key', true);

增加元数据

使用increaseMeta方法增加元数据值

// Set the meta key to an integer value
$post->setMeta('key', 3);

// Increase the meta value by 3 (meta value becomes 6)
$post->increaseMeta('key', 3);

减少元数据

使用decreaseMeta方法减少元数据值

// Set the meta key to an integer value
$post->setMeta('key', 3);

// Decrease the meta value by 1 (meta value becomes 2)
$post->decreaseMeta('key', 1);

子句

按元数据排序

使用orderByMeta子句对数据库结果进行排序

// Sort by 'price' meta in ascending order
Product::orderByMeta('price')->get();

// Sort by 'price' meta in descending order
Product::orderByMeta('price', 'desc')->get();

// Multiple sorting criteria
Product::orderByMeta('price')
    ->orderByMeta('reviews', 'desc')
    ->get();

元数据WHERE子句

使用whereMeta子句根据元数据值筛选项目

// Filter items where 'key' equals 'value'
$result = Post::whereMeta('key', 'value');

// Use operators for more complex filtering
$result = Post::whereMeta('key', '>', 100);

// Combine multiple whereMeta clauses
$result = Post::whereMeta('key', '>', 100)
              ->whereMeta('key', '<', 200);

// Use 'orWhereMeta' for additional OR conditions
$result = Post::whereMeta('key', '>', 100)
              ->orWhereMeta('key', '<', 50);

$result = Post::whereMeta([
    ['key1', 'value1'],
    ['key2', '>', 5],
    ['key3', '<>', 'value3'] // where key3 not equal value3
]);

对于多个OR条件,请使用orWhere

$result = Post::orWhereMeta([
    ['key1', 'value1'],
    ['key2', '>', 5],
    ['key3', 'value3']
]);

元数据IN子句

使用whereMetaIn和whereMetaNotIn子句

$result = Post::whereMetaIn('key', ['value1', 'value2']);
$result = Post::whereMetaNotIn('key', ['value1', 'value2']);

// Multiple clauses
$result = Post::whereMetaIn('key', [1, 2])
              ->whereMetaIn('key2', [1, 2]);

// 'orWhere' clauses
$result = Post::whereMetaNotIn('key', [1, 2, 3])
              ->orWhereMetaIn('key2', [1, 2])
              ->orWhereMetaNotIn('key3', [1, 2]);

元数据为NULL子句

使用whereMetaNull和whereMetaNotNull子句

$result = Post::whereMetaNull('key');
$result = Post::whereMetaNotNull('key');

// Multiple clauses
$result = Post::whereMetaNull('key')
              ->whereMetaNull('key2');

// 'orWhere' clauses
$result = Post::whereMetaNotNull('key')
              ->orWhereMetaNull('key2')
              ->orWhereMetaNotNull('key3');

元数据存在子句

根据元数据的存在情况使用whereMetaHas和whereMetaDoesntHave子句进行记录筛选

// Filter records that have at least one meta
$result = Post::whereMetaHas();

// Filter records that have a specific meta key
$result = Post::whereMetaHas('key');
$result = Post::whereMetaHas('key', true); // Count null values as well

// Filter records that don't have a specific meta key
$result = Post::whereMetaDoesntHave('key');
$result = Post::whereMetaDoesntHave('key', true); // Count null values as well

// Multiple clauses
$result = Post::whereMetaHas('key')
              ->whereMetaDoesntHave('key2');

// 'orWhere' clauses
$result = Post::whereMetaDoesntHave('key')
              ->orWhereMetaHas('key2')
              ->orWhereMetaDoesntHave('key3');

预加载

当您第一次调用$post->getMeta('key')时,将一次性加载该模型的所有元数据。后续从同一模型获取元数据的调用不会执行额外的查询。但是,如果您尝试从不同的模型获取元数据,将执行新的查询。

要使用单个查询加载所有模型的所有元数据,请使用具有withMeta作用域的预加载

$posts = Post::withMeta()->get(); // Returns all post results with their meta values

注意,使用with('meta')对预加载不起作用。

如果您想访问关系进行一些自定义查询,可以使用$post->metaQuery()进行示例

    $post->metaQuery()->where('key', 'key1')->get();

要执行自定义whereHas查询,您可以这样做

    $post->whereHas(Post::metaRelationName(),  function ($query) {
        $query->where('key', 'key1');
        ...
    });

其他方法和功能

注意

所有collect([])[]"{}""[]"""和null值都将作为null存储在数据库中。

如果元数据模型中的某个项目被删除,与其相关的所有元数据也将被删除。

数据类型

可用的数据类型:collectionmodelobjectarrayJSONstringintegerdoublebooleannull

自定义元数据表

默认情况下,所有模型的所有元数据都将存储在meta数据库表中。但是,如果您想为特定模型使用单独的表,请按照以下步骤操作

使用此命令发布包配置文件

php artisan vendor:publish --tag=metable

此命令将在您的配置文件夹中放置一个名为metable.php的文件。

打开配置文件。在tables数组中,您会找到一个custom数组。您可以将新的表名添加到此数组中。例如,要处理用户的元数据,请将users_meta添加到此数组

'tables' => [
    'default' => 'meta',
    'custom'  => [
        'users_meta'
    ],
]

运行迁移命令以创建新表

php artisan migrate

如果您已经迁移了Meta迁移,您应该回滚这些迁移并重新迁移以创建新表。

现在新表已创建,您可以在User模型(或您想使用的任何模型)中指定它,以使用此表处理其元数据

use Melsaka\Metable\Metable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Metable;

    protected $metableTable = 'users_meta';
}

元数据模型

您可以在您的项目中自由使用元数据模型

use Melsaka\Metable\Models\Meta;

$count = Meta::count();

元数据表

元数据表的结构如下

Schema::create('meta', function (Blueprint $table) {
    $table->id();
    $table->integer('parent_id')->unsigned();
    $table->string('parent_type');
    $table->string('key');
    $table->text('value');
    $table->string('type')->default('string');

    $table->index(['parent_type', 'parent_id']);
    $table->index(['parent_type', 'parent_id', 'key']);
    $table->unique(['parent_type', 'parent_id', 'key']);
    $table->timestamps();
});

许可证

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