我创建了一个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
。
如果我想将id:5
的文本更新为D
,则不能这样做,因为id:4
已经有text:D
,parent_id:1
。
似乎没有一种方法可以从验证规则中访问数据库。
我尝试创建一个规则,然后获取route()
,但是它返回一个Illuminate\Http\Request
,而不是一个Laravel\Nova\Http\Requests\NovaRequest
,我可以从中获取基础模型,然后建立查询。
如何针对数据库验证诸如此类的复杂规则?
答案 0 :(得分:0)
尝试以下操作:
public function fields(Request $request)
{
return [
Text::make('Text')
->rules(Rule::unique('tablename')->where(function ($query) use($request) {
return $query->where('text', $request->text)
->where('parent_id', $request->parent_id);
})),
...
]
}
答案 1 :(得分:0)
您可以这样做。
creationRules('unique:TABLENAME,text,NULL,id,parent_id,'。$ request-> Parent) -> updateRules('unique:TABLENAME,text,{{resourceId}},id,parent_id,'。$ request-> Parent),
,您需要像这样创建迁移
$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')
];
}