Laravel 5更新验证


Laravel 5 Update Validation

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

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是否唯一,但如果我更新的数据是在同一字段中,它将只是更新其他字段,如typeprice ?如果我的问题不明确,请纠正我。谢谢你!

的例子:

我的房间表中有2个数据

Data 1:
roomNumber: 214
type: Queen
price: 150.00
Data 2:
roomNumber: 619
type: Suite
price: 250.00

现在,如果我将Data 1字段price150.00更新到160.00,我将得到验证错误The room number has already been taken.,因为当我更新时它也将验证roomNumber。如果我更新的数据相同,我如何在不验证roomNumber的情况下更新它?

首先需要创建一个自定义请求类,如下所示。你可以把它放在一个名为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。

在这里查看文档。

Laravel惟一验证

可以忽略给定的值。所以你的验证仍然可以检查它是否不是重复的,但会忽略那个值。

请看下面的例子:

'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 

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

如果你更新了一个已经在create方法中被检查唯一的记录,那么不需要再检查它。

认为,