Laravel Nova 在创建时用另一个字段的内容填充字段
Laravel Nova populate field with contents of another field on create
我正在 Nova 中定义一些资源,我 运行 遇到了一些问题。我有一个 Team
资源,其字段为 name
和 display_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'),
];
}
我正在 Nova 中定义一些资源,我 运行 遇到了一些问题。我有一个 Team
资源,其字段为 name
和 display_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'),
];
}