首页 > 解决方案 > 在多个唯一字段上验证 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:Cparent_id:NULL我不能因为id:3已经有了text:C, parent_id:NULL

如果我想更新 to 的文本id:5D我不能因为id:4已经有了text:D, parent_id:1

似乎没有办法从验证规则中访问数据库。

我尝试创建一个规则,然后获取route(),但它返回一个Illuminate\Http\Request,而不是一个Laravel\Nova\Http\Requests\NovaRequest,我可以从中获取基础模型,然后构建一个查询。

如何针对数据库验证诸如此类的复杂规则?

标签: validationlaravel-nova

解决方案


你可以这样做。

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')
    ];
}

推荐阅读