如何忽略数组 ID 以验证 Laravel 中的数组?
how to ignore array ID for validating array in Laravel?
我想对数组值进行验证,这是我的代码:
我有一个函数可以使用 hasMany 对另一个 table 进行查询,但我想验证该查询必须是唯一的。我尝试使用此 "required|unique:deed_legalization_numbers, number"
并且这是可行的,但是当我尝试 update/edit 某些字段时,它将 return already taken.
然后我尝试忽略唯一的 ID:
"required|unique:deed_legalization_numbers, number, [$request->input('deed_legalization_numbers')]"
它会return数组到字符串的转换,因为不支持数组
然后我尝试了这个代码:
$deed_legalization_numbers = $request->input('deed_legalization_numbers.*.number');
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number,deed_legalization_numbers.*.id',
[
'required',
Rule::unique('deed_legalization_numbers')->where(function ($query) use ($deed_legalization_numbers, $deed_legalization_id) {
return $query->whereIn('number', $deed_legalization_numbers);
})->ignore($deed_legalization_id[0]) // The problem in this line
],
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
如果我将变量 $deed_legalization_id[0]
更改为 $deed_legalization_id
,我想忽略检查中的 deed_legalization_numbers ID
它将 return 错误:
状态代码:500 内部服务器错误
Symfony\Component\Debug\Exception\FatalErrorException: 方法 Illuminate\Validation\Rules\Unique::__toString() 不得抛出异常,已捕获 ErrorException: addslashes() 期望参数 1 为字符串,文件中给出的数组。 .path\vendor\laravel\framework\src\Illuminate\Validation\ValidationRuleParser.php 第 233 行
0 {主要}
在搜索了这么多帖子后,我找到了解决问题的方法
所以,我只是改变这个
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number',
[
'required',
'distinct',
Rule::unique('deed_legalization_numbers', 'number')->where(function ($query) use ($deed_legalization_id) {
$query->whereNotIn('id', $deed_legalization_id);
return $query;
})
],
];
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
一切都很好,不再重复column_number并且必须是唯一的
您的 self-answer 很有帮助。不确定 2 年前是否存在,但有 an undocumented helper method called whereNotIn()
允许您跳过回调内容。所以我会为你的情况这样做:
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => [
'required',
'distinct',
Rule::unique('deed_legalization_numbers', 'number')
->whereNotIn('id', $deed_legalization_id),
],
];
这导致相同的数据库查询:
select count(*) as aggregate from `deed_legalization_numbers` where `number` = ? and (`id` not in (?));
我想对数组值进行验证,这是我的代码:
我有一个函数可以使用 hasMany 对另一个 table 进行查询,但我想验证该查询必须是唯一的。我尝试使用此 "required|unique:deed_legalization_numbers, number"
并且这是可行的,但是当我尝试 update/edit 某些字段时,它将 return already taken.
然后我尝试忽略唯一的 ID:
"required|unique:deed_legalization_numbers, number, [$request->input('deed_legalization_numbers')]"
它会return数组到字符串的转换,因为不支持数组
然后我尝试了这个代码:
$deed_legalization_numbers = $request->input('deed_legalization_numbers.*.number');
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number,deed_legalization_numbers.*.id',
[
'required',
Rule::unique('deed_legalization_numbers')->where(function ($query) use ($deed_legalization_numbers, $deed_legalization_id) {
return $query->whereIn('number', $deed_legalization_numbers);
})->ignore($deed_legalization_id[0]) // The problem in this line
],
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
如果我将变量 $deed_legalization_id[0]
更改为 $deed_legalization_id
,我想忽略检查中的 deed_legalization_numbers ID
它将 return 错误:
状态代码:500 内部服务器错误
Symfony\Component\Debug\Exception\FatalErrorException: 方法 Illuminate\Validation\Rules\Unique::__toString() 不得抛出异常,已捕获 ErrorException: addslashes() 期望参数 1 为字符串,文件中给出的数组。 .path\vendor\laravel\framework\src\Illuminate\Validation\ValidationRuleParser.php 第 233 行
0 {主要}
在搜索了这么多帖子后,我找到了解决问题的方法
所以,我只是改变这个
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => //'required|unique:deed_legalization_numbers,number',
[
'required',
'distinct',
Rule::unique('deed_legalization_numbers', 'number')->where(function ($query) use ($deed_legalization_id) {
$query->whereNotIn('id', $deed_legalization_id);
return $query;
})
],
];
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
一切都很好,不再重复column_number并且必须是唯一的
您的 self-answer 很有帮助。不确定 2 年前是否存在,但有 an undocumented helper method called whereNotIn()
允许您跳过回调内容。所以我会为你的情况这样做:
$deed_legalization_id = $request->input('deed_legalization_numbers.*.id');
$rules = [
'deed_legalization_numbers.*.number' => [
'required',
'distinct',
Rule::unique('deed_legalization_numbers', 'number')
->whereNotIn('id', $deed_legalization_id),
],
];
这导致相同的数据库查询:
select count(*) as aggregate from `deed_legalization_numbers` where `number` = ? and (`id` not in (?));