melsaka / metable
Laravel 元数据包 - 简化模型元数据管理
Requires
- php: ^7.3|^8.0
- laravel/framework: ^8.75
This package is auto-updated.
Last update: 2024-09-06 11:03:10 UTC
README
通过灵活的元数据管理增强您的 Laravel 应用程序。简化您的数据结构,简化访问,轻松自定义元表。
介绍
Metable 简化了存储大量模型数据而不添加额外的数据库列。
在 Laravel 模型中管理多样化信息(如博客文章)时很有用,它避免了列的混乱,并能够高效地存储独特数据。
功能
-
轻松的数据管理:利用获取器和设置器无缝访问、添加、编辑或删除每个模型的元数据。
-
简化数据库结构:使用我们的高效替代方案,避免在数据库表中创建大量列的混乱。
-
高级排序和筛选:通过根据元属性轻松排序和筛选模型记录来提升模型记录。
-
自定义元表:轻松创建和关联自定义元表与相应的模型,提供灵活性和组织性。
-
多才多艺的元类型:支持广泛的元类型,包括
collection
、model
、object
、array
、JSON
、string
、integer
、double
、boolean
和null
。您的数据,您的方式!
安装
使用 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
存储在数据库中。
如果元数据模型中的某个项目被删除,与其相关的所有元数据也将被删除。
数据类型
可用的数据类型:collection
、model
、object
、array
、JSON
、string
、integer
、double
、boolean
和null
。
自定义元数据表
默认情况下,所有模型的所有元数据都将存储在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)下发布。