更新多条记录时,需要检查tel
字段是否为unique
(id的tel除外(。
我知道用它来验证指定的id
'tel' => 'unique:dtb_users,tel,'.$user->id
但倍数不是
$validator = Validator::make($request->all(), [
'tel.*' => [
'nullable',
'min:10',
'max:12',
'unique:dtb_users,tel' <- stuck here
]
]);
我的表单有更多的字段,这是其中的两个(在foreach
循环中(
<div class="form-group form-group-user form-user-table mb-1">
<input id="email_{{$user->id}}" name="email[{{$user->id}}]" type="email" data-id="{{ $user->id }}" class="form-control email-validation text-color{{ $errors->has("email.$user->id") ? ' is-invalid' : '' }} input_change" value="{{ $old['email'][$user->id] ?? $user->email }}" placeholder="{{__('user.email_placeholder')}}" disabled>
@if ($errors->has("email.$user->id"))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first("email.$user->id") }}</strong>
</span>
@endif
</div>
<div class="form-group form-group-user form-user-table mb-0 number">
<input id="tel_{{ $user->id }}" name="tel[{{ $user->id }}]" class="form-control tel-validation text-color{{ $errors->has('tel.' . $user->id) ? ' is-invalid' : '' }} input_change only-numbers" value="{{ $old['tel'][$user->id] ?? $user->tel }}" placeholder="00000000000" disabled>
@if ($errors->has("tel.$user->id"))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first("tel.$user->id") }}</strong>
</span>
@endif
</div>
我要拔头发了,任何想法都会受到尊重。谢谢大家!
Answer
'unique:dtb_users,tel' -> Rule::unique('dtb_users', 'tel')->ignore(*)
我认为,对form
的input
元素的命名方式进行调整后,以下内容应该会起作用。
在刀片文件中,将name
属性的值更改为以下格式:
name="users[{{ $user->id }}][field]"
所以;
<input id="tel_{{ $user->id }}" name="users[{{ $user->id }}][tel]"
class="form-control tel-validation text-color{{ $errors->has('tel.' . $user->id) ? ' is-invalid' : '' }} input_change only-numbers"
value="{{ $old['tel'][$user->id] ?? $user->tel }}"
placeholder="00000000000"
readonly />
然后在控制器操作中,将验证规则更新为如下:
$validator = Validator::make($request->all(), [
'users' => ['required', 'array'],
'users.*.tel' => [
'nullable',
'min:10',
'max:12',
Rule::unique('users', 'tel')->ignore('*'),
]
]);
我记得在2-3年前,我也为此付出了很多努力。答案是:
'tel' => 'unique:dtb_users,tel,'. $this->id .''
$this->id
是您试图更新的记录。如果它找不到这样的东西,你可以放request()->route()->parameter('paramName');
paramName
是您在路由中声明的那个;
这种方式正在中工作
$validator = Validator::make($request->all(), [
'tel.*' => [
'nullable',
'min:10',
'max:12',
new UserTelUniqueRule($request->all('id', 'tel'))
]
]);
在UserTelUniqueRule
中
<?php
namespace AppRules;
use AppModelsDtbUsers;
use IlluminateContractsValidationRule;
class UserTelUnique implements Rule
{
/**
* @param array $input
*/
protected $input;
/**
* Create a new rule instance.
* @param array $input
*
* @return void
*/
public function __construct($input)
{
$this->input = $input;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
foreach ($this->input['id'] as $id) {
$tel = $this->input['tel'][$id];
if (is_null($tel)) {
continue;
}
$user = DtbUsers::where('tel', $tel)
->where('id', '!=', $id)
->whereNull('deleted_at')
->first();
if ($user) {
return false;
}
}
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('validation.unique');
}
}