我有一个名为关键字的表,如下
id keyword syntax description
我有一个用于编辑KEYWORD详细信息的表单,我对这个表单的验证规则与我对创建表单和数据库的验证规则相同。
基本上,关键字必须是唯一的,但在更新时,如果我只想更新关键词的详细信息,它将失败,并警告我密钥已经存在,所以我不能更新keyowords因为它们的密钥没有更改,因此向我抛出了数据库唯一规则。
我的型号等级
public static $rules = array(
'keyword' => 'required|unique:keywords',
'syntax'=>'required',
'description'=>'required'
);
要强制验证器忽略给定id
的unique
规则,您可以传递正在验证的记录的id
,例如:
'keyword' => 'required|unique:keywords,keyword,10'
如果id
是10
,则不会检查模型的唯一性,因此当您更新模型时,您需要传递当前模型的id
以忽略此模型上的唯一规则:
'keyword' => 'required|unique:keywords,keyword,' . $id
由于您的规则变量是public static $rules
,因此您可以从控制器访问它,在这种情况下,在更新方法中运行验证之前,您需要更改keywords
字段的规则,我认为您可以这样更改规则(只需为该字段设置新规则):
// Replace the Model with the name of your model within the controller
// update method before the validation takes place
Model::$rules['keyword'] = 'required|unique:keywords,keyword,' . $id;
查看文档。
您可以用不同的方法来完成。
#1一个简单的方法是使用负责这一部分的Ardent。#2编辑时,您可以将"忽略id规则"传递给Validator
$rules = array(
'keyword' => 'required|unique:keywords,'.$id,
'syntax'=>'required',
'description'=>'required'
);
#3一种更复杂的方法是将验证作为服务使用。基于不同操作的不同规则。创建模型时,将使用当前的规则。
当你将更新模型时,你会将unique:keywords更改为exists:keywords-
我通常使用验证服务来完成此操作。
您可以在services/中创建一个基本抽象Validator,它有一个passes()函数。
对于每个模型,您创建一个ModelValidator,在您的案例中是CityValidator。你把你的规则放在哪里,比如:
public static $rules = array(
'new'=>[
'keyword' => 'required|unique:keyword',
'syntax'=>'required',
'description'=>'required'],
'edit'=>[
'keyword' => 'required|exists:keyword',
'syntax'=>'required',
'description'=>'required'
]
)
定义规则
class Dev扩展\ Eloquent
public static $rules = array(
'id' => "required|min:1|max:999|unique:dev,id",
'name' => 'required|min:2|max:32|unique:dev,name',
'alias' => 'required|min:2|max:32|unique:dev,alias',
);
应用规则
类TreeController扩展\BaseController{
public function update($id)
{
$rules = Dev::$rules;
if ($id !== null) {
$rules['id'] .= ",$id";
$rules['name'] .= ",$id";
$rules['alias'] .= ",$id";
}
$input = array_except(Input::all(), '_method');
$v = Validator::make($input, $rules);
if ($v->passes()) {
$dev = $this->dev->find($id);
try {
$dev->update($input);
} catch (Exception $e) {
Session::flash('error', $e->getMessage());
}
return Redirect::route('adm.pattern.dev.index');
} else {
Session::flash('error', implode('<br />', $v->errors()->all(':message')));
return Redirect::route('adm.pattern.dev.edit', $id)->withInput()->withErrors($v);
}
}
}