vkovic/laravel-model-meta

Laravel模型元数据存储

v1.0.1 2019-11-14 08:31 UTC

This package is auto-updated.

Last update: 2024-09-14 19:47:56 UTC


README

Build Downloads Stable License

Laravel模型元数据存储

轻松存储和访问模型相关元数据,避免在模型表中添加更多字段而造成混乱。

兼容性

该包与Laravel版本5.55.65.75.86兼容。

安装

通过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包,您应该运行它附带的测试。最简单的方法是使用Dockerdocker-composephpunit

首先,我们需要初始化Docker容器

docker-compose up -d

然后,我们可以运行测试并查看输出

docker-compose exec app vendor/bin/phpunit

类似包

该包是三种基于相同方法的元数据包之一

这些包可以单独使用,也可以一起使用。它们在内部使用相同的表并共享公共逻辑。