Laravel 5更新验证

时间:2015-10-18 08:16:39

标签: php laravel laravel-5

我在laravel中有一个工作的crud代码,但我的问题是验证。这是我的代码:

public function update(Request $request)
{
    $room_id =  $this->route('route');
    $validator = \Validator::make(\Request::all(), [
        'roomNumber' => 'required|unique:rooms,roomNumber,',
        'type' => 'required',
        'price' => 'required',
    ]);

    if(!$validator -> fails()){
        $id  = \Request::input('id');
        $com = Room::find($id);

        $room -> roomNumber = \Request::input('roomNumber', 'Test');
        $room -> type = \Request::input('type', 'Test');
        $room -> price = \Request::input('price', '0.00');
        $room -> description = \Request::input('description', 'Test');

        $com -> save();

        return redirect('rooms') -> with('message', 'Room Updated!');
    } else {
        return redirect('rooms') -> withErrors($validator->errors());
    }
}

如您所见,roomNumber是必需的,应该是唯一的。我的问题是,这是更新代码。如果我只想更新pricetype等字段,该怎么办?每当我更新一个字段时,我总是在我的视图中得到The room number has already been taken.,因为是的,roomNumber在我的验证中应该是唯一的。

如何更新仍会检查room number是否唯一的特定字段,但如果我正在更新的数据位于同一字段中,则只会更新其他字段,例如{{1}和type?如果我的问题含糊不清,请纠正我。谢谢!

示例:

我的房间表中有2个数据

price

现在,如果我将Data 1: roomNumber: 214 type: Queen price: 150.00 Data 2: roomNumber: 619 type: Suite price: 250.00 字段Data 1price更新为150.00,我将收到验证错误160.00,因为它还会验证{我更新时{1}}如果我正在更新的数据相同,如何在不验证The room number has already been taken.的情况下更新它?

3 个答案:

答案 0 :(得分:4)

首先需要创建一个自定义请求类,如下所示。您可以将其放在名为RoomRequest.php

的单独文件中
use app\Http\Requests\Request;

class RoomRequest extends Request
 {
    public function authorize()
    {
        return true; //or check auth here
    }

    public function rules()
    {
        $room_id =  $this->input('id');
        return [
         'roomNumber' => 'required|unique:rooms,roomNumber','.$room_id',
       //whatever else
    ];
    }
}

然后在您的控制器中,使用上面的请求类

   public function update(RoomRequest $request)
    {
        $id  = $request->input('id');
        $room = Room::find($id);

        $room -> roomNumber = $request->input('roomNumber', 'Test');
        $room -> type = $request->input('type', 'Test');
        $room -> price = $request->input('price', '0.00');
        $room -> description = $request->input('description', 'Test');

        $room-> save();

        return redirect('rooms') -> with('message', 'Room Updated!');
    }

这可确保Laravel从您想要的验证中排除现有ID。

答案 1 :(得分:1)

请查看文档。

Laravel Unique Validation

您可以忽略给定的值。因此,您的验证仍然可以检查它是否不重复,但会忽略该值。

见这里的例子:

'email'     => 'required|unique:Management,email,' . $this->route('management')

使用$ this-> route('management'),我获得了我目前正在尝试更新的管理记录的ID。所以这个ID将被忽略。

另请参阅我的路线列表:

| GET|HEAD | admin/management
| GET|HEAD | admin/management/create
| PUT      | admin/management/{management}
| DELETE   | admin/management/{management}
| PATCH    | admin/management/{management}
| GET|HEAD | admin/management/{management}
| GET|HEAD | admin/management/{management}/edit 

答案 2 :(得分:0)

您只需要在create方法中验证唯一的主键,在update方法中,您不必再次验证唯一性,因为它肯定会一直失败。

如果您更新在create method中已检查唯一的现有记录,则无需再次检查。

此致