Laravel Nova使用create上另一个字段的内容填充字段

时间:2019-08-02 14:53:21

标签: php laravel laravel-nova

我在Nova中定义了一些资源,但遇到了一些问题。我有一个Team资源,其中包含字段namedisplay_name。我只希望使用display_name在仪表板上可见,但是我拥有Team模型的方式是,name可以通过将display_name变成一个子弹来填充。创建资源时,是否有一种方法基于Nova填充name的内容display_name

Text::make('Name')->displayUsing(function(){
                return Str::slug($this->display_name, '_');
            })->hideFromIndex()
                ->hideFromDetail()
                ->hideWhenCreating()
                ->hideWhenUpdating(),

            Text::make('Display Name')
                ->rules('required', 'max:254')
                ->creationRules('unique:teams,name')
                ->updateRules('unique:teams,name,{{resourceId}}'),

            Textarea::make('Description')
                ->rules('required'),

这是我现在所拥有的,它确实为我提供了name的正确输出,其中包含已经创建的资源,但是当我尝试创建一个新团队时,出现此错误:

enter image description here

SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (SQL: insert into 'teams' ('display_name', 'description', 'updated_at', 'created_at')

1 个答案:

答案 0 :(得分:1)

您可以使用Laravel Mutator解决此问题。在这里阅读:

https://laravel.com/docs/5.8/eloquent-mutators

参考我的代码:

// app\Team.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Team extends Model
{
    public function setDisplayNameAttribute($value)
    {
        $this->attributes['display_name'] = $value;
        $this->attributes['name'] = Str::slug($this->display_name, '_');
    }
}

// app\Nova\Team.php
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Text::make('Display Name','display_name'),
            Text::make('Name')->onlyOnIndex(),
            Text::make('Description'),
        ];
    }