jsefton / laravel-virtual-fields
允许eloquent模型存储和检索数据,而无需特定的数据库列
1.0.0
2021-05-03 09:01 UTC
Requires
- laravel/framework: >=7.0
This package is auto-updated.
Last update: 2024-08-29 05:44:03 UTC
README
允许eloquent模型存储和检索数据,而无需特定的数据库列。
虚拟字段挂钩到eloquent属性获取,允许它使用特定字段映射数据,但仍支持所有eloquent的核心功能以及数据库表中虚拟和物理字段的混合。
安装
composer require jsefton/laravel-virtual-fields
使用 & 要求
Virtual Fields是一个可以在任何eloquent模型中使用的特性。例如。
use Illuminate\Database\Eloquent\Model; use JSefton\VirtualFields\VirtualFields; class Post extends Model { use VirtualFields; }
为了使虚拟字段正常工作,所需的模型数据库表必须有一个名为data
的字段。您应该为希望使用Virtual Fields的每个模型/表添加此字段,通过迁移完成。
php artisan make:migration add_virtual_field_data_table_to_{table} --table={table}
一旦创建迁移,您将想要添加类似以下内容的新字段并处理在回滚方法中的删除。
/** * Run the migrations. * * @return void */ public function up() { Schema::table('{table}', function (Blueprint $table) { $table->longText('data')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('{table}', function (Blueprint $table) { $table->dropColumn(['data']); }); }
data
字段被设置为longText
的原因是支持Virtual Fields的长期使用。如果您继续通过Virtual Fields添加新的数据存储,最终会在该列中形成一个大的JSON对象。如果您知道它只用于少量数据,请确保您的迁移使用合适的数据类型。
示例
一旦设置,您可以直接使用常规属性获取和设置针对模型。当被保存到数据库中时,这将被自动处理,并在查询时将它们转换回实际属性。
在这个例子中,我们有一个Post和一个虚拟字段sub_title
。这个字段在数据库模式中不是物理字段。
$post = Post::find(1); // Set a virtual field of sub_title $post->sub_title = 'Example post sub title'; $post->save();
sub_title
将被保存在data
字段中,映射为包含sub_title
键和Example post sub title
值的数组。
当您想要将值取出来使用时,您只需像使用任何常规eloquent属性一样使用它。
echo $post->sub_title; // outputs: Example post sub title
请注意,目前仅适用于Laravel 7+,直到在较低版本中进行测试和验证。
待办事项
- 添加对查询Virtual Fields的支持,无需JSON查询要求。