Laravel 唯一验证,仅当值不同且没有 id 时

Laravel unique validation, only if value is different & without id

我正在尝试更新数据,为此我在我的表单上使用了一个方法补丁。

更新验证请求

use Illuminate\Validation\Rule;

'question' => [
    'required',
    'string',
    Rule::unique('faqs_questions','question'),
    'max:30',
],

如果我的问题没有变化,它会给我一个错误:

The question has already been taken.

dd($this->toArray()) 根据验证请求让我得到以下输出:

array:9 [▼
    "_method" => "PATCH"
    "_token" => "LLqlQfMpzSdyAInVOaqs5lqBMbEvNT9eMDU9ZZxJ"
    "my_name_TOApMPqqwwBasdts9bLa" => null
    "valid_from" => "eyJpdiI6IkJ2TUpZV29ZV0Qzasdasdaasgst5345wtgrtyegq4yhq4qhgqgMDU1"
    "question" => "Question B"
    "answer" => "Answer B"
]

我尝试在我的请求文件中使用 Rule::unique('faqs_questions','question')->ignore($this->question),,但我认为它需要我们在任何输入中都没有的 ID。有什么办法可以解决吗?

将其放入隐藏输入怎么样?

如果您通过 question 发送的内容是独一无二的,您也可以使用类似这样的方式:Rule::unique('users')->ignore($this->question, 'slug')

您可以执行以下操作,其中使用 where 子句表示我们要检查 question 是否已经在 table.

$validator = Validator::make(['question' => $request->question], [
    'question' => [ 
        'required', 
        'string',
        Rule::unique('faq_questions')->where('question', '!=', $request->question),
        'max:30'
    ]
]);

您可以将其检查的字段更改为任何您想要的字段,希望上面的内容能让您大致了解。

然后您可以检查验证是否成功:

if ($validator->fails()) {
   // error
}

这是我在 laravel 8、

中验证的工作示例
public function edit($id, Request $request){
        $request->validate([
            'email' => 'required|email',Rule::unique('users')->ignore($id, 'id'),
            'fname' => 'required',
            'sname' => 'required',
            'lname' => 'required',
        ]);
        $user = User::find($id);
        $input = $request->all();
        $results = array_filter($input);
        $user->fill($results)->save();
        return response()->json(['user' => $user, 'success' => 'Your Info Has been Saved']);
    }

如果我理解你的问题