liam-wiltshire/laravel-model-meta

Eloquent 的元数据支持

0.5.0 2024-02-06 20:39 UTC

This package is auto-updated.

Last update: 2024-09-06 21:49:22 UTC


README

liam-wiltshire/laravel-model-meta 是 Laravel Eloquent 模型的扩展,用于为模型添加元数据。

什么元数据?

虽然 Eloquent 在处理关系数据方面非常出色,但并非所有我们处理的数据都像这样工作。在未使用类似 Mongo 的 NoSQL 解决方案的情况下,使用 MySQL 来存储关系数据,但添加一个 JSON 元数据字段可能是一个潜在的解决方案。

liam-wiltshire/laravel-model-meta 允许您使用标准的 Eloquent 获取器和设置器为模型添加和删除元数据。与数据库表中的列相关的任何属性都将被处理为标准属性,但其他任何内容都将添加到元数据中。

这为您提供了很大的灵活性,可以在适当的地方拥有结构化数据(例如,一本书总是有标题、作者等),但也可以有其他相关的非结构化数据(例如,一些书可能有页数,而另一些则没有)

在结构化数据时,考虑是否需要能够查询这些数据非常重要。除非您在数据库级别使用类似虚拟列的东西,否则这些数据不可查询 - 它们不是为了存储该记录的主要数据而设计的。

示例

$book = new \App\Models\Book();

$book->forceFill(
[
    'title' => 'Laravel Quickstart Guide',
    'author_id' => 90,
    'publisher_id' => 5,
    'description' => 'This is an awesome book'
]
);

$book->save();

$book = \App\Models\Book::find(1);

//This is an actual field in the DB, so this will be set to that attribute
$book->title = 'Laravel Quickstart Guide, Second Edition';

//This isn't a field in the DB, and isn't a relationship etc, so will be stored in the meta field
$book->page_count = 200;

$test->save();

此代码将生成一个新的 Test 模型并将其保存到数据库中。假设 meta_subject 不是我们表中的一列,则 meta_subject 将自动添加到元数据中

root@localhost:[homestead]> SELECT id, title, meta FROM books;
+----+------------------------------------------+--------------------+
| id | title                                    | meta               |
+----+------------------------------------------+--------------------+
|  1 | Laravel Quickstart Guide, Second Edition | {"page_count":200} |
+----+------------------------------------------+--------------------+

安装

liam-wiltshire/laravel-model-meta 作为 composer 包可用:composer require liam-wiltshire/laravel-model-meta

安装后,在您的模型中使用 \LiamWiltshire\LaravelModelMeta\Concerns\HasMeta 特性。

模型背后的数据库表需要添加一个元数据列 - 默认情况下,特性假定这将是 meta

$table->json('meta')->nullable()->default(null);

如果您的元数据列名称不同,则向您的模型添加一个包含该字段名称的 $metaDbField 属性

protected $metaDbField = 'metaData';