Laravel Nova:将字段动态绑定到模型上的JSON属性

时间:2019-02-25 09:46:00

标签: laravel eloquent laravel-nova

Laravel Nova

对于一个特定的项目,我想结合使用Nova Resource UI和更灵活的数据模型。具体来说,我希望能够将字段添加到存储在JSON数据库字段而不是表中的属性的资源中。

具体:

数据库模型:报价(包括迁移)

public function up()
{
    Schema::create('quotations', function(Blueprint $table)
    {
        $table->bigInteger('id', true);
        $table->timestamps();
        $table->string('client_name', 100)->nullable();
        $table->string('client_surname', 100)->nullable();
        $table->string('status', 10)->nullable()->default('NEW');
        $table->text('data')->nullable();
    });
}

Nova资源

因此,我可以定义“常规” NOVA资源,并在App \ Nova \ Quotation中定义以下字段(*忽略状态):

public function fields(Request $request)
{
    return [
        Text::make('Client Name')->sortable(),
        Text::make('Client Surname')->sortable(),


    ];
}

现在,我的“愿望”是使用 不存在的“ bindTo” 方法来说明我想要实现的目标

public function fields(Request $request)
{
    return [
        Text::make('Client Name')->sortable(),
        Text::make('Client Surname')->sortable(),

        //Fields bound into the JSON data property  
        Text::make('Client Id')->bindTo('data.client_id),
        Date::make('Client Date Of Birth')->bindTo('data.client_date_of_birth),

        //etc       


    ];
}

因此,当保存了报价模型时,client_name和client_surname属性将照常保存到数据库中。但是client_id和client_date_of_birth应该保存到JSON数据属性。

我知道我可以在报价模型上设置一个Mutator

public function setClientIdAttribute($value)
{
      set_data($this->data,'client_id',$value);
}

但是,仍然需要“非动态”报价模型。我希望能够动态地向视图中添加字段,而不必在基础知识之外更改报价模型。一个真实的例子是,不同的产品在生成报价之前要收集不同的输入字段。然后,我可以轻松地在Nova资源中动态注入字段定义,同时保持数据库模型简单。

我还尝试了一个简单问题的答案: Laravel Model Dynamic Attribute

但是-建议的解决方案不起作用,因为Nova仍在寻找桌子上的属性。

我很乐意就如何解决此要求提供一些意见。

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

// Model
protected $casts = [
    'data' => 'array'
];

// Nova Resource  
Text::make('Client Id', 'data->client_id')->resolveUsing(function ($value) {
   return $value;
}),