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仍在寻找桌子上的属性。
我很乐意就如何解决此要求提供一些意见。
答案 0 :(得分:2)
您可以执行以下操作:
// Model
protected $casts = [
'data' => 'array'
];
// Nova Resource
Text::make('Client Id', 'data->client_id')->resolveUsing(function ($value) {
return $value;
}),