Laravel 验证唯一
Laravel validation unique
我有一个带有唯一列的 table。
我的表单验证规则如下所示:
return Validator::make($data, [
'nameEN' => 'required|string',
'nameHE' => 'required|string',
'address' => 'required|string|min:10|unique:clients'
]);
我的问题是,当我编辑一行时,如果我没有更改地址列,则会收到验证错误。
我的编辑功能是这样的:
public function editPost(Request $request,$id){
$client = new Client();
$client->editValidation($request->all())->validate();
$row = $client->where('id',$id)->get()->first();
$update = array();
if(!empty($request->input("nameEN")) && $request->input("nameEN") != $row->nameEN) $update["nameEN"] = $request->input("nameEN");
if(!empty($request->input("nameHE")) && $request->input("nameHE") != $row->nameHE) $update["nameHE"] = $request->input("nameHE");
if(!empty($request->input("address")) && $request->input("address") != $row->address) $update["address"] = $request->input("address");
if(empty($update)) $message = $this->message("info", "Notic: Client {$row->nameEN} was not updated because nothing was changed.");
else if($client->where("id",$row->id)->update($update)){
$message = $this->message("success", "Client {$row->nameEN} was updated.");
} else {
$message = $this->message("danger", "Error: Client {$row->nameEN} was not updated.");
}
$redirect = redirect("clients");
if(isset($message)) $redirect->with("message",$message);
return $redirect;
}
如果我从我的验证规则中删除 unique
,我可能会遇到 mysql 错误。
如何解决这个问题?
提前致谢。
来自docs:
有时,您可能希望在唯一性检查期间忽略给定的 ID,
指示验证器忽略对象的 ID
'address' => 'required|string|min:10|unique:clients,address,'.$id
或者您可以使用 Rule
class
use Illuminate\Validation\Rule;
Validator::make($data, [
'address' => [
Rule::unique('clients')->ignore($id),
]
]);
If your table uses a primary key column name other than id, you may specify the name of the column when calling the ignore method:
'address' => Rule::unique('clients')->ignore($id, 'primary_key')
用于验证 laravel 5.6 上的唯一列:
仅用于按需使用的字段:
唯一:table,列,除了,idColumn
'address' => 'required|string|min:10|unique:clients,address,'.$id
当您想使用单独的 class 进行验证时。我使用一个通用的 class 作为添加和更新:
public function rules()
{
if($this->method() == 'POST')
$address = 'required|string|min:10|unique:clients,address';
else
$address = 'required|string|min:10|unique:clients,address,'.$this->id;
//put a hidden input field named id with value on your edit view and catch it here;
return [
'nameEN' => 'required|string',
'nameHE' => 'required|string',
'address' => $address
];
}
我有一个带有唯一列的 table。 我的表单验证规则如下所示:
return Validator::make($data, [
'nameEN' => 'required|string',
'nameHE' => 'required|string',
'address' => 'required|string|min:10|unique:clients'
]);
我的问题是,当我编辑一行时,如果我没有更改地址列,则会收到验证错误。
我的编辑功能是这样的:
public function editPost(Request $request,$id){
$client = new Client();
$client->editValidation($request->all())->validate();
$row = $client->where('id',$id)->get()->first();
$update = array();
if(!empty($request->input("nameEN")) && $request->input("nameEN") != $row->nameEN) $update["nameEN"] = $request->input("nameEN");
if(!empty($request->input("nameHE")) && $request->input("nameHE") != $row->nameHE) $update["nameHE"] = $request->input("nameHE");
if(!empty($request->input("address")) && $request->input("address") != $row->address) $update["address"] = $request->input("address");
if(empty($update)) $message = $this->message("info", "Notic: Client {$row->nameEN} was not updated because nothing was changed.");
else if($client->where("id",$row->id)->update($update)){
$message = $this->message("success", "Client {$row->nameEN} was updated.");
} else {
$message = $this->message("danger", "Error: Client {$row->nameEN} was not updated.");
}
$redirect = redirect("clients");
if(isset($message)) $redirect->with("message",$message);
return $redirect;
}
如果我从我的验证规则中删除 unique
,我可能会遇到 mysql 错误。
如何解决这个问题?
提前致谢。
来自docs:
有时,您可能希望在唯一性检查期间忽略给定的 ID, 指示验证器忽略对象的 ID
'address' => 'required|string|min:10|unique:clients,address,'.$id
或者您可以使用 Rule
class
use Illuminate\Validation\Rule;
Validator::make($data, [
'address' => [
Rule::unique('clients')->ignore($id),
]
]);
If your table uses a primary key column name other than id, you may specify the name of the column when calling the ignore method:
'address' => Rule::unique('clients')->ignore($id, 'primary_key')
用于验证 laravel 5.6 上的唯一列:
仅用于按需使用的字段:
唯一:table,列,除了,idColumn
'address' => 'required|string|min:10|unique:clients,address,'.$id
当您想使用单独的 class 进行验证时。我使用一个通用的 class 作为添加和更新:
public function rules()
{
if($this->method() == 'POST')
$address = 'required|string|min:10|unique:clients,address';
else
$address = 'required|string|min:10|unique:clients,address,'.$this->id;
//put a hidden input field named id with value on your edit view and catch it here;
return [
'nameEN' => 'required|string',
'nameHE' => 'required|string',
'address' => $address
];
}