Laravel 检查没有自身更新的唯一规则
Posted
技术标签:
【中文标题】Laravel 检查没有自身更新的唯一规则【英文标题】:Laravel check for unique rule without itself in update 【发布时间】:2015-03-27 17:53:03 【问题描述】:我在更新部分有我的唯一验证规则。
在插入或添加唯一规则时是'Email' => array('unique:driver_details'),
,它将检查唯一列。
但是更新部分失败了。在更新它时满足其他规则,并且在电子邮件的唯一性中,它正在检查自己的唯一列,它失败但看到了自己的字段。
那么,我如何在数据库中检查除了它自己的值之外的唯一值?
【问题讨论】:
Laravel 4 validation email unique constraint的可能重复 @patricus:我收到了你的问题,但在你的回答中你没有说如何获得 $id,如果他们确实验证了他们自己的个人资料,他们就可以得到他们的 id由Auth::user()->id
和如果管理员对其他部分做这些部分,我应该设置会话并进入模型,,,???
您目前如何获取您尝试更新的记录的 ID?
我正在将所有值发送到模型,$validation = Validator::make($DriverData, DriverModel::$updaterules);
我在这里发了一个新问题,会很清楚,你可以看看这里,,***.com/questions/28205762/…
【参考方案1】:
$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);
this $id 强制一个独特的规则忽略给定的 id 这对我有用
【讨论】:
【参考方案2】:这是其他解决方案,注意路由参数,是用户的“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',
//...
];
//...
【讨论】:
【参考方案3】:这在 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)
]
];
【讨论】:
【参考方案4】:有一种更短的方法,在我的情况下,我使用的是路由模型绑定, 网址格式为
/something/user/something
return [
'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
];
【讨论】:
【参考方案5】:你可以试试这样检查删除的列是否为空
例如:
$this->validate($request, [
'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);
【讨论】:
【参考方案6】:检查一下,
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
在这里查看https://laravel.com/docs/7.x/validation#rule-unique。
【讨论】:
【参考方案7】:它会起作用的......
$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'
]
);
【讨论】:
【参考方案8】:我对创建和更新使用相同的规则。但是为了更新,我需要它忽略自我。
这是我用的:
public function rules()
return [
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user->id ?? 0),
],
// ...other fields
];
如果更新,则$this->user->id
将被忽略。
否则,如果它被创建,它将忽略 id 0,它本来就不存在。
【讨论】:
【参考方案9】:我通常在控制器构造上创建一个规则数组,如下所示:
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
【讨论】:
【参考方案10】:尝试使用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'
]);
【讨论】:
只是为访问者添加注释,此方法适用于 Laravel/Lumen 7.0 :-)【参考方案11】:<?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,
];
【讨论】:
【参考方案12】:试试这个
'email' => 'unique:table_name,column_name,'.$this->id.',id'
$this->id
将是您请求中的值
【讨论】:
【参考方案13】:在 Laravel 6 应用程序中,它帮助我从验证中排除当前用户的电子邮件:
use Illuminate\Validation\Rule;
public function update(Request $request, $id)
$request->validate([
'email' => [
'email',
'required',
Rule::unique('claims')->ignore($id),
],
]);
// ...
【讨论】:
【参考方案14】:这个问题也有一段时间了。试试这个:
$v = Validator::make($request->all(), [
'email' => ['required',
Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
]
]);
适用于 Laravel 5.8。我不知道它是否适用于较低版本的 Laravel。
【讨论】:
【参考方案15】:我花了一段时间才弄明白,但是当您处理更新/创建请求时,您也可以访问请求对象。在这里,我强制客户端名称是唯一的,但允许当前编辑的客户端。
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'
];
【讨论】:
【参考方案16】:这会强制忽略特定的 id:
'email' => 'unique:table,email_column_to_check,id_to_ignore'
在上面的示例中替换段 table
、email_column_to_check
、id_to_ignore
你可以在这里查看http://laravel.com/docs/4.2/validation#rule-unique
【讨论】:
但是我怎样才能在模型中获得id_to_ignore
,我无法获得Auth::user()->id
,因为这是管理部分并为其他用户进行验证..
你可以像这样从请求中得到它:request()->route('route wildcard')->id
如果您像这样定义路由:Route::apiresource('car', 'Api\CarController')
,那么您可以像这样检索资源的 ID:request()->route('car')
或 request()->route()->parameters['car]
。如果您在请求对象中,您也可以使用$this
而不是request()
。【参考方案17】:
我正在使用 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'
【讨论】:
【参考方案18】:$request->validate([
'email' => 'unique:table_name,email,' . $user->id
]);
【讨论】:
欢迎来到 ***!请考虑在您的代码中添加一些解释,以便 OP 和其他用户可以深入了解您的答案如何以及为什么适用。 :)【参考方案19】:通过书写包含规则
use Illuminate\Validation\Rule;
并编写您的验证代码如下:
'Email' => [required,
Rule::unique('driver_details')->ignore($id),
]
这里的 $id 是您在验证期间要忽略的电子邮件的 ID,它是从控制器获取的。
【讨论】:
【参考方案20】:对于那些使用 Laravel 5 和 Form Requests 的用户,您可以直接将 Route-Model Binding 的模型的 id 作为 Form Request 的属性获取为$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)
也可以使用。以上是关于Laravel 检查没有自身更新的唯一规则的主要内容,如果未能解决你的问题,请参考以下文章