首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel :在模型上将字段动态绑定到JSON属性

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

Stack Overflow用户
提问于 2019-02-25 09:46:00
回答 1查看 3.6K关注 0票数 0

拉拉维尔·诺瓦

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

具体情况:

数据库模型:引文(包括迁移)

代码语言:javascript
复制
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\引号中定义以下字段(*忽略状态):

代码语言:javascript
复制
public function fields(Request $request)
{
    return [
        Text::make('Client Name')->sortable(),
        Text::make('Client Surname')->sortable(),


    ];
}

现在,我的“愿望”就是要有这样的效果,使用不存在的"bindTo"方法来说明我想要实现的目标。

代码语言:javascript
复制
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数据属性中。

我知道我可以在报价模型上设置一个突变体

代码语言:javascript
复制
public function setClientIdAttribute($value)
{
      set_data($this->data,'client_id',$value);
}

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

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

然而,提议的解决方案不起作用,因为Nova仍在寻找表上的属性。

我想得到一些关于如何解决这一要求的意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 17:58:32

你可以这样做:

代码语言:javascript
复制
// Model
protected $casts = [
    'data' => 'array'
];

// Nova Resource  
Text::make('Client Id', 'data->client_id')->resolveUsing(function ($value) {
   return $value;
}),
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54863332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档