我在Nova中定义了一些资源,但遇到了一些问题。我有一个Team
资源,其中包含字段name
和display_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
的正确输出,其中包含已经创建的资源,但是当我尝试创建一个新团队时,出现此错误:
SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (SQL: insert into 'teams' ('display_name', 'description', 'updated_at', 'created_at')
答案 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'),
];
}