我在更新部分中有唯一的验证规则。
插入或添加唯一规则是'Email' => array('unique:driver_details'),
,它将检查唯一的coloumn。
但是更新部分失败了。虽然更新它满足其他规则,并且在电子邮件的唯一中它会检查自己的唯一coloumn并且它会失败但看到自己的字段。
那么,我如何检查数据库中除了自己的值之外的唯一?
这会强制忽略特定的id:
'email' => 'unique:table,email_column_to_check,id_to_ignore'
在上面的例子中替换段table
,email_column_to_check
,id_to_ignore
对于使用Laravel 5和Form Requests的用户,您可以直接将Route-Model Binding的模型的id作为$this->name_of_the_model->id
的Form Request的属性获取,然后使用它从唯一规则中忽略它。
例如,如果您想拥有唯一的电子邮件,但也允许管理员编辑用户,您可以执行以下操作:
路线:
Route::patch('users/{user}', 'UserController@update');
控制器:
public function update(UserRequest $request, User $user)
{
// ...
}
表格要求:
class UserRequest extends FormRequest
{
// ...
public function rules()
{
return [
'name' => 'required|string',
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user->id, 'id')
],
//...
];
}
//...
}
请注意,我们忽略了正在编辑的用户,在这种情况下,用户可能与经过身份验证的用户不同。
通过书面形式包括规则
use Illuminate\Validation\Rule;
并编写您的验证码如下:
'Email' => [required,
Rule::unique('driver_details')->ignore($id),
]
这里$ id是您在验证期间要从控制器获取的电子邮件的ID。
$request->validate([
'email' => 'unique:table_name,email,' . $user->id
]);
我正在使用Laravel 5.2
如果您的主键名为'id',则表名为users_table,我想更新user_name,所以我这样做
'user_name' => 'required|unique:users_table,user_name,'.$id
如果您的主键未命名为“id”在我的情况下,我的主键是user_id,表名是users_table,我想更新user_name
所以我这样做
'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'
这花了我一段时间来弄清楚但是当你处理更新/创建请求时,你也可以访问请求对象。在这里,我强制要求客户端名称是唯一的,但允许当前编辑的客户端。
class CreateUpdateClientRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => [
'required',
'string',
'min:3',
'max:50',
Rule::unique('clients')->ignore($this->request->get('id'))
],
'primary_contact_name' => 'required|string|min:3|max:50',
'primary_contact_email' => 'required|string|email|min:5|max:50',
'primary_contact_phone' => 'nullable|string|min:5|max:50',
'secondary_contact_name' => 'nullable|string|min:3|max:50',
'secondary_contact_email' => 'nullable|string|email|min:5|max:50',
'secondary_contact_phone' => 'nullable|string|min:5|max:50',
'notes' => 'nullable'
];
}
}
也有一段时间也面临这个问题。试试这个:
$v = Validator::make($request->all(), [
'email' => ['required',
Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
]
]);
适用于Laravel 5.8。我不知道它是否适用于较低版本的Laravel。