在多个唯一字段上验证Nova

时间:2019-01-14 02:40:35

标签: validation laravel-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:Cparent_id:NULL

如果我想将id:5的文本更新为D,则不能这样做,因为id:4已经有text:Dparent_id:1

似乎没有一种方法可以从验证规则中访问数据库。

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

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

2 个答案:

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