liam-wiltshire / laravel-model-meta
Eloquent 的元数据支持
Requires
- php: >=7.1.0
- illuminate/database: ^5.5.0|^6.0|^7.0|^8.0|^9.0|^10.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/php-code-coverage: ^6.0.0
- phpunit/phpunit: ^7.0.0
- squizlabs/php_codesniffer: ^3.0.0
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';