vkovic / laravel-model-meta
Laravel模型元数据存储
v1.0.1
2019-11-14 08:31 UTC
Requires
- php: ^7.1
- vkovic/laravel-meta: ^0.2.2|^0.3
Requires (Dev)
- laravel/laravel: ^6.0
- orchestra/database: ^4.0
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.0
README
Laravel模型元数据存储
轻松存储和访问模型相关元数据,避免在模型表中添加更多字段而造成混乱。
兼容性
该包与Laravel版本5.5
、5.6
、5.7
、5.8
和6
兼容。
安装
通过composer安装包
composer require vkovic/laravel-model-meta
运行迁移以创建用于存储模型元数据的表
php artisan migrate
简单示例
为了能够从我们的模型对象中写入元数据,我们需要将HasMetadata
特质添加到我们想要关联元数据的模型中。以Laravel默认的User
模型为例
namespace App\Models; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Vkovic\LaravelModelMeta\Models\Traits\HasMetadata; class User extends Authenticatable { use Notifiable, HasMetadata; // <= trait is added here // ... }
假设我们已经有用户在我们的用户表中。下面的示例将需要一个随机的一个
$user = User::inRandomOrder()->first();
让我们为获取的用户创建和检索一些元数据
// Set meta value as string $user->setMeta('foo', 'bar'); // Get meta value $user->getMeta('foo'); // : 'bar' // In case there is no metadata found for given key, // we can pass default value to return $user->getMeta('baz', 'default'); // : 'default'
除了字符串,元数据还可以存储为整数、浮点数、null、布尔值或数组
$user->setMeta('age', 35); $user->setMeta('temperature', 24.7); $user->setMeta('value', null); $user->setMeta('employed', true); $user->setMeta('fruits', ['orange', 'apple']); $user->getMeta('age'); // : 35 $user->getMeta('temperature'); // : 24.7 $user->getMeta('value'); // : null $user->getMeta('employed'); // : true $user->getMeta('fruits'); // : ['orange', 'apple']
我们可以轻松地检查相关用户元数据是否存在,而无需实际从元数据表中检索它
$user->setMeta('foo', 'bar'); $user->metaExists('foo'); // : true
统计所有相关用户元数据记录也是轻而易举的
$user->setMeta('a', 'one'); $user->setMeta('b', 'two'); $user->countMeta(); // : 2
如果我们需要所有用户元数据或只是键,没问题
$user->setMeta('a', 'one'); $user->setMeta('b', 'two'); $user->setMeta('c', 'three'); // Get all metadata $user->allMeta(); // : ['a' => 'one', 'b' => 'two', 'c' => 'three'] // Get only keys $user->metaKeys(); // : [0 => 'a', 1 => 'b', 2 => 'c']
此外,我们还可以轻松地删除所有用户元数据
$user->setMeta('a', 'one'); $user->setMeta('b', 'two'); $user->setMeta('c', 'three'); // Remove meta by key $user->removeMeta('a'); // Or array of keys $user->removeMeta(['b', 'c']);
如果我们出于某种原因想要一次性删除与该用户相关的所有元数据,没问题
$user->purgeMeta();
通过元数据作用域检索模型
HasMetadata
特质还提供了过滤具有特定元数据的模型的功能,以下是一些示例
$user->setMeta('age', 35); // Equals operator User::whereMeta('age', '=', 35)->get(); // or shorther User::whereMeta('age', 35)->get(); // Comparison operators User::whereMeta('age', '>', 18)->get(); User::whereMeta('age', '!=', 20)->get(); // or with other comparison operators (<, <=, >, >=, =, <>, !=) // All of the examples above will return Collection of users which meet's criteria, // in this case our $user
除了根据元数据值过滤用户,我们还可以根据元数据键进行过滤
$user->setMeta('company', 'Acme'); $anotherUser->setMeta('role', 'admin'); // Meta key User::whereHasMetaKey('manager')->get(); // Array of keys User::whereHasMetaKey(['company', 'role'])->get(); // All of the examples above will return Collection of users which meet's criteria, // in this case our $user and $anotherUser
检查模型是否有元数据
如果您需要检查模型是否有元数据功能,可以实现该包附带的一个接口,如下所示
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Vkovic\LaravelModelMeta\Models\Interfaces\HasMetadataInterface; class User extends Authenticatable implements HasMetadataInterface // <= interface is added here { // ... }
实现HasMetadataInterface
使我们能够检查我们的模型是否实现了元数据功能。
if ($model instanceof HasMetadataInterface) { // ... do something }
贡献
如果您计划修改此Laravel包,您应该运行它附带的测试。最简单的方法是使用Docker
、docker-compose
和phpunit
。
首先,我们需要初始化Docker容器
docker-compose up -d
然后,我们可以运行测试并查看输出
docker-compose exec app vendor/bin/phpunit
类似包
该包是三种基于相同方法的元数据包之一
- vkovic/laravel-model-meta(此包 - Laravel模型相关元数据存储)
- vkovic/laravel-meta(通用元数据存储)
- vkovic/laravel-settings(应用特定设置元数据存储)
这些包可以单独使用,也可以一起使用。它们在内部使用相同的表并共享公共逻辑。