Laravel唯一验证,仅当值不同时&;没有身份证

Laravel唯一验证,仅当值不同时&;没有身份证,laravel,laravel-8,laravel-validation,Laravel,Laravel 8,Laravel Validation,我正在尝试更新数据,为此我在表单上使用了一个方法补丁 更新验证请求 use Illuminate\Validation\Rule; 'question' => [ 'required', 'string', Rule::unique('faqs_questions','question'), 'max:30', ], 如果我的问题没有变化,我会出错: 这个问题已经提出了 dd($this->toArray())根据验证请求获得以下输出: array:9

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

更新验证请求

use Illuminate\Validation\Rule;

'question' => [
    'required',
    'string',
    Rule::unique('faqs_questions','question'),
    'max:30',
],
如果我的问题没有变化,我会出错:

这个问题已经提出了

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\u questions','question')->ignore($this->question),
,但我认为它需要我们在任何输入中都没有的id。有办法解决吗?

把它放到一个隐藏的输入中怎么样


如果您通过
question
发送的任何内容都是唯一的,您也可以使用类似这样的内容:
Rule::unique('users')->ignore($this->question,'slug')
您可以执行以下操作,使用
where
子句来表示我们要检查
问题
不在表中

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

如果我能很好地理解你的问题

我想我已经在使用slug作为一个独特的参数了。假设我将
'question B'
转换为
'question A'
并提交表单,然后
$this->question
将选择输入作为
'question A'
而不是
'question B'
。我们需要确保slug被传递给request(我想是这样的),这样我们就可以调用一个ID使其唯一并忽略该特定ID。有什么线索可以帮助我们完成这项任务吗?如果你更改slug,你就更改了slug,因此它就不能再被用作标识符。如果你打算时不时地换鼻涕虫,我就不赞成那种解决办法。在这种情况下,隐藏的输入更安全。但是,如果您想要执行slug解决方案,请确保将
slug
添加到
$guarded
中。您可以看到输出中没有可用的slug参数。我们如何才能在其中提取slug?哪个输出?您不显示模型结构。所以这是我最好的猜测。您必须知道您的项目设置可以实现什么。我接受此解决方案,但我们可以在请求中执行相同的操作吗?因为我的验证是在更新验证请求文件中完成的,并且我希望避免在Controlleries中使用验证,您可以在
FormRequest
s中使用
规则::unique(…)