validation - 在多个唯一字段上验证 Nova
问题描述
我创建了一个 Nova 资源,其基础模型作为父级链接到自身。我需要一个验证规则,其中每个父 ID 的文本都是唯一的。
id text parent_id
1 A NULL
2 B NULL
3 C NULL
4 D 1
5 E 1
6 F 2
所以,如果我想用 , 创建一个新项目text:C
,parent_id:NULL
我不能因为id:3
已经有了text:C
, parent_id:NULL
。
如果我想更新 to 的文本id:5
,D
我不能因为id:4
已经有了text:D
, parent_id:1
。
似乎没有办法从验证规则中访问数据库。
我尝试创建一个规则,然后获取route()
,但它返回一个Illuminate\Http\Request
,而不是一个Laravel\Nova\Http\Requests\NovaRequest
,我可以从中获取基础模型,然后构建一个查询。
如何针对数据库验证诸如此类的复杂规则?
解决方案
你可以这样做。
creationRules('unique:TABLENAME,text,NULL,id,parent_id,'.$request->Parent) ->updateRules('unique:TABLENAME,text,{{resourceId}},id,parent_id,'.$request->父母),
你需要像这样创建迁移
$table->bigIncrements('id');
$table->string('text');
$table->unsignedBigInteger('parent_id');
$table->unique(['text','parent_id']);
这是我的资源的例子
public function fields(Request $request)
{
return [
// unique:models,name,NULL,id,company_id,
ID::make()->sortable(),
BelongsTo::make('Pais','Pais',\App\nova\Pais::class),
Text::make('Provincia','nombre')->sortable()
->rules('required','min:2','max:30')
->creationRules('unique:provincias,nombre,NULL,id,pais_id,'.$request->Pais)
->updateRules('unique:provincias,nombre,{{resourceId}},id,pais_id,' .$request->Pais),
BelongsTo::make('Estado')
];
}
推荐阅读
- python - 优化 Lifetime 的 BG/NBD fitter 的执行
- dart - 将 EPOC 时间戳转换为 DateTime?在 json_serializable
- css - react-bootstrap css 覆盖自定义 css
- php - 将值附加到多选时,jquery重复项目
- list - Flutter 中有没有办法将长 ListView 拆分为多个“页面”?
- python - 没有位置参数的仅关键字参数
- python - 如何通过 python 获取 dspace controldesk 实时数据?
- java - 如何在不单击href链接的情况下引用div id?
- pyspark - 通过 pyspark 数据框创建配置单元管理的分区表并为每个运行附加数据
- laravel - Laravel - 客户端同时调用一个函数导致重复记录