jsefton/laravel-virtual-fields

允许eloquent模型存储和检索数据,而无需特定的数据库列

1.0.0 2021-05-03 09:01 UTC

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查询要求。