【问题标题】:Laravel Nova ignore a field if empty using ->fillUsing()Laravel Nova 使用 ->fillUsing() 忽略字段如果为空
【发布时间】:2019-12-31 11:02:19
【问题描述】:

我有 3 个字段“名称”、“电子邮件”和“网址”。这 3 个字段在我的数据库的 1 列中转换为 json。

现在,如果您只填写 url,我只想将 {url: "value"} 保存在数据库中。如果您填写电子邮件和姓名,我只想在数据库中保存{name: "john", email: "john@gmail.com"}

我尝试这样做:

Text::make('To Name', 'toName')
            ->sortable()
            ->fillUsing(
                function ($request, $model) {
                    return $request->toName;
                }
            ),

Text::make('To Email', 'toEmail')
            ->sortable()
            ->fillUsing(
                function ($request, $model) {
                    return $request->toEmail;
                }
            ),

Text::make('To Url', 'toUrl')
            ->sortable()
            ->fillUsing(
                function ($request, $model) {
                    return $request->toUrl;
                }
            ),

但我不断收到此错误:

一般错误:1364 字段 'to' 没有默认值

我返回的东西有问题吗?

【问题讨论】:

标签: laravel laravel-5 laravel-nova


【解决方案1】:

检查此代码,使用 Laravel mutator 并在您的 fillUsing 中进行一些更改。注意toName、toEmail、toUrl是虚拟属性,to_json是model中这些列的json值!

// database\migrations\2019_08_28_045853_create_infos_table.php
...
        Schema::create('infos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('label',100);
            $table->json('to_json');
        });

// app\Nova\Info.php
...    
public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Text::make('Label'),
            Text::make('To Name', 'toName')
                ->sortable()
                ->fillUsing(
                    function ($request, $model) {
                        if(!empty($request->toName)){
                            if(!empty($model['to_json'])){
                                $json = json_decode($model['to_json'],true);
                            }else{
                                $json = [];
                            }
                            $json['name'] = $request->toName;
                            $model['to_json'] = json_encode($json);
                        }
                    }
                ),
            Text::make('To Email', 'toEmail')
                ->sortable()
                ->fillUsing(
                    function ($request, $model) {
                        if(!empty($request->toEmail)){
                            if(!empty($model['to_json'])){
                                $json = json_decode($model['to_json'],true);
                            }else{
                                $json = [];
                            }
                            $json['email'] = $request->toEmail;
                            $model['to_json'] = json_encode($json);
                        }
                    }
                ),
            Text::make('To Url', 'toUrl')
                ->sortable()
                ->fillUsing(
                    function ($request, $model) {
                        if(!empty($request->toUrl)){
                            if(!empty($model['to_json'])){
                                $json = json_decode($model['to_json'],true);
                            }else{
                                $json = [];
                            }
                            $json['url'] = $request->toUrl;
                            $model['to_json'] = json_encode($json);
                        }
                    }
                ),
        ];
    }

// app\Info.php
...
class Info extends Model
{
    public function gettoNameAttribute(){
        if(empty($this->attributes['to_json'])){
            return "";
        }
        $json = $this->attributes['to_json'];
        $result = json_decode($json,true);
        if(!empty($result['name'])){
            return $result['name'];
        }else{
            return "";
        }
    }

    public function gettoEmailAttribute(){
        if(empty($this->attributes['to_json'])){
            return "";
        }
        $json = $this->attributes['to_json'];
        $result = json_decode($json,true);
        if(!empty($result['email'])){
            return $result['email'];
        }else{
            return "";
        }
    }

    public function gettoUrlAttribute(){
        if(empty($this->attributes['to_json'])){
            return "";
        }
        $json = $this->attributes['to_json'];
        $result = json_decode($json,true);
        if(!empty($result['url'])){
            return $result['url'];
        }else{
            return "";
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2014-05-15
    • 2014-09-27
    相关资源
    最近更新 更多