elhareth / laravel-eloquent-metable
一个用于扩展 Laravel Eloquent 模型数据的包
Requires
- php: ^8.0
- ext-json: *
- illuminate/collections: ^10.0
- illuminate/contracts: ^10.0
- illuminate/database: ^10.0
- illuminate/support: ^10.0
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)下发布。