我在更新部分有我的唯一验证规则。
在插入或添加唯一规则'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
在上面的例子中
对于那些使用 Laravel 5 和 Form Requests 的人,您可以直接获取 Route-Model Binding 的模型的 id 作为 Form Request as 的属性,$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')
],
//...
];
}
//...
}
请注意,我们忽略了正在编辑的用户,在这种情况下,它可能与经过身份验证的用户不同。
$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'
通过写入包含规则
use Illuminate\Validation\Rule;
并编写您的验证代码,如下所示:
'Email' => [required,
Rule::unique('driver_details')->ignore($id),
]
这里 $id 是您在验证期间要忽略的电子邮件的 ID,它是从控制器获取的。
检查这个,
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
尝试这个
'email' => 'unique:table_name,column_name,'.$this->id.',id'
$this->id
将是您请求中的值
在 Laravel 6 应用程序中,它帮助我从验证中排除当前用户的电子邮件:
use Illuminate\Validation\Rule;
public function update(Request $request, $id)
{
$request->validate([
'email' => [
'email',
'required',
Rule::unique('claims')->ignore($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'
];
}
}
有一种更短的方法,在我的情况下,我使用的是路由模型绑定,URL 格式是
/something/{user}/something
return [
'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
];
也有一段时间面临这个问题。尝试这个:
$v = Validator::make($request->all(), [
'email' => ['required',
Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
]
]);
适用于 Laravel 5.8。我不知道它是否适用于较低版本的 Laravel。
这是其他解决方案,注意路由参数,是用户的“id”。与 Arian Acosta 提到的解决方案进行比较。
路线:
Route::patch('users/{id}', [UserController::class, 'update']);
控制器:
public function update(UserRequest $request, $id)
{
// ...
}
表格要求:
class UserRequest extends FormRequest
{
public function rules()`
{
return [
'name' => 'required|string',
'email' => 'required|email|unique:users,email,'.$this->id.',id',
//...
];
}
//...
}
这在 Laravel 8 上对我有用。
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|string',
'email' => [
'required',
'email',
Rule::unique('users', 'email')->ignore($this->user)
]
];
}
}
尝试使用Rule::unique('users')->ignore(Auth::id())
//Validation
$data = $request->validate([
'username' => ['required', Rule::unique('users')->ignore(Auth::id()), 'min:4'], //Verificar que este seleccionado sea único {Exceptuando mi mismo}
'content' => 'required|min:6',
'cover' => 'required|image'
]);
我对创建和更新使用相同的规则。但是对于更新,我需要它忽略自我。
这就是我使用的:
public function rules()
{
return [
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user->id ?? 0),
],
// ...other fields
];
}
如果更新,$this->user->id
则将被忽略。否则,如果它被创建,它将忽略 id 0,无论如何它都不存在。
您可以尝试这样检查是否在列删除为空
例如:
$this->validate($request, [
'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);
<?php
namespace App\Http\Requests\Admin\User;
use App\Model\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
class UpdateRequest extends FormRequest
{
protected $id;
public function __construct(Request $request)
{
$this->id = (integer) $request->route()->user;
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'first_name' => 'required|max:20',
'last_name' => 'nullable|max:20',
'mobile' => 'required|size:10|unique:users,mobile,'.$this->id,
];
}
}
$validator = validator()->make($request->all(), [
'product_name' => 'required|min:10|unique:products,name,'.$id,
'product_slug' => 'required|min:10|unique:products,slug,'.$id,
'product_desc' => 'required',
'short_desc' => 'required',
'color' => 'required',
'product_sku' => 'required|unique:products,sku,'.$id,
'offer_price' => 'required',
'actual_price' => 'required',
'product_size*' => 'required',
'product_image*'=> 'required|mimes:jpeg,png,jpg',
'product_brand' => 'required',
'product_meta' => 'required',
]);
if($validator->fails()) {
$messages = $validator->messages();
return redirect()->back()->withErrors($messages);
}
这个 $id 强制一个独特的规则忽略给定的 id 这对我有用
它会工作...
$this->validate($request,
[
'name' => 'required|unique:your_table_name,column_name,'.$request->auto_increment_id
],
[
'name.required' => 'Name should not be empty',
'name.unique' => 'Name Already Exists'
]
);
我通常在控制器构造上创建一个规则数组,如下所示:
public function __construct()
{
$this->rules = [
'name' => 'required',
'isCPNJ' => 'required',
'CPF_CNPJ' => 'required',
'password' => 'sometimes',
'role_id' => 'sometimes',
];
}
然后,当我需要验证特定的东西时,比如更新时的 id 和电子邮件,我创建一个 specificRules 变量并连接我希望在规则末尾忽略的 id,如下所示:
//Add the original rules to specificRules, just to make things more readable
$specificRules = $this->rules;
//Add the new rules
$specificRules['email'] = 'required|email|unique:users,email,' . $request['id'];
$specificRules['id'] = 'required|exists:users';
//Validate and save in $postData
$postData = $this->validate($request, $specificRules);
如果有人有更清洁和简单的方法,请告诉我:D