忽略Update函数的唯一验证


Ignoring Unique Validation on Update Fucntion Laravel 5

我有这个customer模型,当你创建一个唯一的phone_num。它在创建中工作得很好,但在我的更新功能中,这是一个基于id的自动填充值的表单。如果用户只按照预期更新了address,那么unique验证将再次触发The phone num has already been taken.,我该如何处理这个问题?我希望用户能够更新它的信息,如果phone_num仍然相同,则忽略unique验证,从而允许unique验证,如果用户选择更改phone_num

我代码:

public function update($id)
{
    $rules = array(
        'title'             => 'required',
        'firstname'         => 'required',
        'lastname'          => 'required',
        'gender'            => 'required',
        'birthdate'         => 'required',
        'age_bracket'       => 'required',
        'addr1'             => 'required',
        'addr2'             => 'required',
        'addr3'             => 'required',
        'addr4'             => 'required',
        'town'              => 'required',
        'country'           => 'required',
        'postcode'          => 'required',
        'phone_num'         => 'required|unique:customers',
        'phone_type'        => 'required',
        'work_status'       => 'required',
        'home_status'       => 'required',
        'marital_status'    => 'required',
    );
    $validator = Validator::make(Input::all(), $rules);

    // Check if all fields is filled
    if ($validator->fails()) 
    {
        return Redirect::to('customer/'.$id.'/edit')->withErrors($validator);
    }
    else
    {
        $customer = Customer::find($id);
        $customer->title           = Input::get('title');
        $customer->gender          = Input::get('gender');
        $customer->firstname       = Input::get('firstname');
        $customer->lastname        = Input::get('lastname');
        $customer->postcode        = Input::get('postcode');
        $customer->addr1           = Input::get('addr1');
        $customer->addr2           = Input::get('addr2');
        $customer->addr3           = Input::get('addr3');
        $customer->addr4           = Input::get('addr4');
        $customer->addr4           = Input::get('addr4');
        $customer->town            = Input::get('town');
        $customer->country         = Input::get('country');
        $customer->phone_num       = Input::get('phone_num');
        $customer->phone_type      = Input::get('phone_type');
        $customer->birthdate       = Input::get('birthdate');
        $customer->work_status     = Input::get('work_status');
        $customer->home_status     = Input::get('home_status');
        $customer->marital_status  = Input::get('marital_status');
        $customer->agebracket      = Input::get('age_bracket');
        if($customer->save())
        {
            Session::flash('alert-success', 'Form Submitted Successfully.');
        }
        else
        {
            Session::flash('alert-danger', 'Error on submitting form.');
        }
        return Redirect::to('customer/'.$id.'/edit');
    }
}

unique规则有一些额外的参数,看起来像unique:table,column,except,idColumn

那么在您的例子中,except将是id, idColumn将是您的id列的名称,可能是id

因此,考虑到这一点,您希望您的验证规则是…

'required|unique:customers,phone_num,'.$id.',id'

在L5.3+中,您可以使用Rule Facade流畅地处理它。请注意验证规则现在将是数组,而不是使用分隔符。使用说明' '验证规则;

Validator::make($data, [
    'email' => [
    'required',
    Rule::unique('users')->ignore($user->id),
    ],
 ]);

或者你可以在你的表单请求中做的是(对于Laravel 5.3+)

 public function rules()
    {
        return [
            'email' => 'required|email|unique:users,email,'.$this->user, //here user is users/{user} from resource's route url
               ];
    }