2015-10-18 99 views
1

我在laravel有一個工作的crud代碼,但我的問題是驗證。這裏是我的代碼:Laravel 5更新驗證

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?如果我的問題含糊不清,請糾正我。謝謝!

例子:

我在我的房間表

Data 1: 
roomNumber: 214 
type: Queen 
price: 150.00 

Data 2: 
roomNumber: 619 
type: Suite 
price: 250.00 

現在2分數據的,如果我從150.00更新Data 1price160.00,我會得到驗證錯誤The room number has already been taken.,因爲它也將驗證我更新時的roomNumber。如果我正在更新的數據是相同的,我如何在不驗證roomNumber的情況下更新它?

+0

抱歉,你可以澄清一點,當你說「..但如果我更新的數據是在同一個領域,它只會更新其他領域,如類型和價格」。你能給個例子嗎 ? – codegeek

+0

@codegeek更新了我的文章 – FewFlyBy

回答

3

您首先需要創建一個自定義的請求類,如下所示。你可以把它放進一個單獨的文件在你的控制器稱爲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將排除要驗證現有的IDS。

+0

未定義變量:房間 – FewFlyBy

+0

請參閱我的編輯。你需要創建一個請求,然後在控制器中使用 – codegeek

+0

非常感謝!如果這是我的代碼http://pastebin.com/XMRaUYvR,現在當我添加RoomRequest時,它會顯示什麼? – FewFlyBy

0

您只需要在create方法中驗證主鍵的唯一性,在update方法中,您不必再次驗證唯一性,因爲它肯定會一直失敗。

如果更新已在create方法中檢查唯一的現有記錄,則無需再次檢查它。

Regards,

1

這裏檢查文檔。

Laravel Unique Validation

可以忽略的給定值。因此,您的驗證仍然可以檢查它是否不重複,但會忽略該值。

在這裏看到一個例子:

'email'  => 'required|unique:Management,email,' . $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 
+0

我收到Method [路徑]不存在。 – FewFlyBy

+0

您應該將此代碼放入Request類中,而不是放在您的控制器中。 http://laravel.com/docs/5.1/validation#other-validation-approaches。檢查表單請求驗證。 –