Laravel Nova 在创建时用另一个字段的内容填充字段

Laravel Nova populate field with contents of another field on create

我正在 Nova 中定义一些资源,我 运行 遇到了一些问题。我有一个 Team 资源,其字段为 namedisplay_name。我只希望 display_name 在仪表板上可见,但我拥有 Team 模型的方式是通过将 display_name 变成一个 slug 来填充 name。有没有办法在创建资源时根据 display_name 的内容用 Nova 填充 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 提供了正确的输出,其中包含已经创建的资源,但是当我尝试创建一个新团队时,我得到了这个错误:

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

您可以使用 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'),
        ];
    }