我正在更新部分使用我的验证规则以确保唯一性。
在插入或添加时,唯一性规则为'Email' => array('unique:driver_details')
,它将检查唯一列。
但是,这在更新部分失败。在更新中,它满足其他规则,并且在电子邮件的唯一性上,它正在检查自己的唯一列并失败,因为它看到了自己的字段。
那么,如何检查除了数据库中自身的值以外的唯一性?
我正在更新部分使用我的验证规则以确保唯一性。
在插入或添加时,唯一性规则为'Email' => array('unique:driver_details')
,它将检查唯一列。
但是,这在更新部分失败。在更新中,它满足其他规则,并且在电子邮件的唯一性上,它正在检查自己的唯一列并失败,因为它看到了自己的字段。
那么,如何检查除了数据库中自身的值以外的唯一性?
这将强制忽略特定的id:
'email' => 'unique:table,email_column_to_check,id_to_ignore'
在上面的示例中,替换段落中的table
、email_column_to_check
和id_to_ignore
。
id_to_ignore
呢?我无法获取 Auth::user()->id
,因为这是管理员部分,而且正在对其他用户进行验证。 - user3388086request()->route('路由通配符')->id
。 - Jelly BeanRoute::apiresource('car', 'Api\CarController')
,那么您可以通过以下方式获取资源的ID:request()->route('car')
或者 request()->route()->parameters['car']
。如果您在请求对象内部,也可以使用 $this
代替 request()
。 - totymedli对于使用 Laravel 5 和表单请求的用户,您可以直接将路由模型绑定的模型 ID 作为表单请求的属性 $this->name_of_the_model->id
并使用它来从唯一规则中忽略它。
例如,如果您想要有唯一的电子邮件地址,但也允许管理员编辑用户,则可以执行以下操作:
路由:
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')
],
//...
];
}
//...
}
请注意,我们忽略正在被编辑的用户,这种情况下该用户可能与经过身份验证的用户不同。Rule::unique('users')->ignoreModel($this->user)
。 - Daniel CheungRule::unique('users')->ignoreModel($this->user())
是正确的语法。 - senty$this->user
返回由路由模型绑定解析的用户,而 $this->user()
返回当前用户(即与调用 auth()->user()
相同)。 - PlumsAhoy$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'
试试这个
'email' => 'unique:table_name,column_name,'.$this->id.',id'
$this->id
将是您请求的值。
通过书写Include规则
use Illuminate\Validation\Rule;
'Email' => [required,
Rule::unique('driver_details')->ignore($id),
]
请检查这个:
'email' => [
'required',
Rule::unique('users')->ignore($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'
];
}
}
use Illuminate\Validation\Rule;
public function update(Request $request, $id)
{
$request->validate([
'email' => [
'email',
'required',
Rule::unique('claims')->ignore($id),
],
]);
// ...
}
Laravel 8:
$request->validate([
'email' => 'required|unique:users,email,'. $user->id,
]);
Auth::user()->id
获得他们的id,对于管理员将这些部分分配给其他部分,我应该设置会话并在模型内获取吗??? - user3388086$validation = Validator::make($DriverData, DriverModel::$updaterules);
。 - user3388086