为laravel nova资源中creationRules中的3个字段添加唯一验证

问题描述 投票:2回答:1

创建用户时,我希望laravel nova中的adhar_number,phone_number和电子邮件是唯一的。

我尝试执行以下操作,

public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),

            Text::make('Adhaar Number')->rules('required'), 

            Text::make('Phone Number')->rules('required'),

            Text::make('Email')->rules('max:255', 'required')
                ->creationRules('unique:users,adhaar_number,phone_number,email'),

        ];
    }

上面的字段定义给出了一条成功消息,表明已创建资源,但是应该产生错误消息。它在日志文件中记录重复条目错误。

laravel validation unique laravel-nova
1个回答
0
投票

[据我所知,您想验证“电子邮件”与先前提供的两个输入一并是唯一的...我想像需要使用神奇的fillUsing()方法以及手册Validator !^ _ ^

/* *_create_users_table.php (Migration) */
...
$table->unique(['adhaar_number', 'phone_number', 'email']);

/* User.php (Nova Resource) */
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
...
Text::make('Adhaar Number', 'adhaar_number')
    ...,

Text::make('Phone Number', 'phone_number')
    ...,

Text::make('Email', 'email')
    ... // exclude the unique rule for now
    ->fillUsing(function ($request, $model, $attribute, $requestAttribute) {
        if ($request->exists($requestAttribute)) {
            if ($request->method() === 'POST') {
                // Upon creation
                $validator = Validator::make($request->all(), [
                    'email' => [
                        Rule::unique('users', 'email')
                            ->where(function ($query) {
                                return $query
                                    ->where('adhaar_number', $request['adhaar_number'])
                                    ->where('phone_number', $request['phone_number']);
                                }),
                    ],
                ]);
            } elseif ($request->method() === 'PUT') {
                // Upon update
                $validator = Validator::make($request->all(), [
                    'email' => [
                        Rule::unique('users', 'email')
                            ->where(function ($query) {
                                return $query
                                    ->where('adhaar_number', $request['adhaar_number'])
                                    ->where('phone_number', $request['phone_number']);
                                })
                            ->ignore(
                                $model
                                    ->where('adhaar_number', $request['adhaar_number'])
                                    ->where('phone_number', $request['phone_number'])
                                    ->pluck('id')->first()
                            ),
                    ],
                ]);
            }

            $validator->validate();
        }
    }),

© www.soinside.com 2019 - 2024. All rights reserved.