我正在更新部分使用我的验证规则以确保唯一性。
在插入或添加时,唯一性规则为'Email' => array('unique:driver_details')
,它将检查唯一列。
但是,这在更新部分失败。在更新中,它满足其他规则,并且在电子邮件的唯一性上,它正在检查自己的唯一列并失败,因为它看到了自己的字段。
那么,如何检查除了数据库中自身的值以外的唯一性?
我正在更新部分使用我的验证规则以确保唯一性。
在插入或添加时,唯一性规则为'Email' => array('unique:driver_details')
,它将检查唯一列。
但是,这在更新部分失败。在更新中,它满足其他规则,并且在电子邮件的唯一性上,它正在检查自己的唯一列并失败,因为它看到了自己的字段。
那么,如何检查除了数据库中自身的值以外的唯一性?
有一种更简单的方法,我使用的是路由模型绑定, URL格式为
/something/{user}/something
return [
'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
];
<?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,
];
}
}
'supplier_name' => 'required|string|max:20',
'supplier_company' => 'required|string|max:25',
'supplier_telephone' => 'required|string|max:13',
'supplier_email' => 'required', 'email',Rule::unique('suppliers')->ignore($supplier->id),
您可以尝试这样做,检查列中的删除情况是否为 null。
例如:
$this->validate($request, [
'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);
'phone' => 'string|required|max:11|min:11|unique:users,phone,'.Auth::user()->phone.',phone'
这个对我在 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)
]
];
}
}
这是另一种解决方案,需要注意路由参数,它是用户的“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',
//...
];
}
//...
}
它会工作...
$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'
]
);
我也遇到了这个问题一段时间。尝试这个方法:
$v = Validator::make($request->all(), [
'email' => ['required',
Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
]
]);
适用于Laravel 5.8。我不知道它是否适用于较低版本的Laravel。
public function rules()
{
return [
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user->id ?? 0),
],
// ...other fields
];
}
$this->user->id
将被忽略。
否则,如果是创建操作,它将忽略 id 0,因为它根本不存在。
Auth::user()->id
获得他们的id,对于管理员将这些部分分配给其他部分,我应该设置会话并在模型内获取吗??? - user3388086$validation = Validator::make($DriverData, DriverModel::$updaterules);
。 - user3388086