我正在使用Jeffrey Way的模型验证(https://github.com/JeffreyWay/Laravel-Model-Validation)来验证保存和更新。使用此方法,假设您在条目上填写更新某些字段,然后调用save()
方法,验证将在当前在条目上设置的所有字段上运行。但是,如果验证要求字段(比如电子邮件地址)是唯一的,则验证将失败,因为它已经存在:
user.php的:
protected static $rules = [
'email' => 'required|email|unique:users',
'firstname' => 'required',
'lastname' => 'required'
];
Controller.php这样:
// Get user from id
$user = User::find($id);
// Update user
$user->update($data);
// Validation when model is saved, via Way\Database\Model
if ($user->save())
{
return Response::json([
'data' => $user->toArray()
], 200);
}
if ($user->hasErrors())
{
return Response::json([
'errors' => $user->getErrors()
]);
}
将返回错误,因为电子邮件地址验证失败。那么,使用这种方法,您如何告诉验证者忽略电子邮件的唯一规则?
答案 0 :(得分:0)
我遇到了这个问题!我自己决定了这个问题。
protected static $rules = [
'email' => $user->email == Input::get('email') ? 'required|email' : 'required|email|unique:users',
'firstname' => 'required',
'lastname' => 'required'
];
答案 1 :(得分:0)
使用此程序包无法执行此操作,因为您需要为unique
规则传递id。你可以这样做:
protected static $rules = [
'email' => 'required|email|unique:users,email,{id}',
'firstname' => 'required',
'lastname' => 'required'
];
并扩展此模型以添加自定义验证方法,以{id}
属性替换id
答案 2 :(得分:0)
我认为我使用不同方法的类似行为。使用这个模型,我推翻覆盖验证方法以从自定义方法获取规则,你可以为现有模型设置新规则。
这样的事情可行:
protected function processRules($rules = array()) {
$result = [];
if (empty($rules)) {
$rules = static::$rules;
}
// Add unique except :id
$replace = ($this->exists()) ? ',' . $this->getKey() : '';
foreach ($rules as $key => $rule) {
$result[$key] = str_replace(',:' . $this->getKeyName(), $replace, $rule);
}
return $result;
}
覆盖您的validate方法以调用proccessRules
方法。
public function validate() {
$v = $this->validator->make($this->attributes, $this->processRules(static::$rules), static::$messages);
if ($v->passes()) {
return true;
}
$this->setErrors($v->messages());
return false;
}
现在,您可以将email
规则定义为required|email|unique:users:id
,当新用户的规则应为required|email|unique:users
时,当您更新ID为1234的用户时,规则将是required|email|unique:users:1234
。
我希望它适合你。