Laravel 4-重复/独特的火灾数据更新如何防止



我有一个名为关键字的表,如下

id  keyword syntax  description

我有一个用于编辑KEYWORD详细信息的表单,我对这个表单的验证规则与我对创建表单和数据库的验证规则相同。

基本上,关键字必须是唯一的,但在更新时,如果我只想更新关键词的详细信息,它将失败,并警告我密钥已经存在,所以我不能更新keyowords因为它们的密钥没有更改,因此向我抛出了数据库唯一规则。

我的型号等级

public static $rules = array(
                                'keyword' => 'required|unique:keywords',
                                'syntax'=>'required',
                                'description'=>'required'
                                );

要强制验证器忽略给定idunique规则,您可以传递正在验证的记录的id,例如:

'keyword' => 'required|unique:keywords,keyword,10'

如果id10,则不会检查模型的唯一性,因此当您更新模型时,您需要传递当前模型的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);
    }
}

}

最新更新