2015-10-18 6 views
1

У меня есть рабочий crud-код в laravel, но моя проблема - это проверка. Вот мой код:Laravel 5 Update Validation

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()); 
    } 
} 

Как вы можете видеть, номер комнаты необходим и должен быть уникальным. Моя проблема в том, что это код обновления. Что делать, если я просто хочу обновить какое-то поле, например, price или type? Всякий раз, когда я обновляю поле, я всегда получаю The room number has already been taken. на мой взгляд, потому что да, номер комнаты должен быть уникальным в моей проверке.

Как я могу обновить конкретное поле, которое все равно будет проверять, если room number является уникальным, но если данные я обновление в том же поле, он будет просто обновить другие поля, такие как type и price? Пожалуйста, поправьте меня, если мой вопрос будет расплывчатым. Спасибо!

Пример:

У меня есть 2 данных в моей таблице номеров

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

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

Теперь, если я обновить Data 1 поле price от 150.00 к 160.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 исключает существующие идентификаторы из проверки, которые вы хотите.

+0

Неопределенная переменная: номер – FewFlyBy

+0

см. Мое редактирование. вам нужно создать запрос, а затем использовать его в контроллере – codegeek

+0

Спасибо большое! Если это мой код http://pastebin.com/XMRaUYvR, что он будет выглядеть сейчас, когда я добавлю RoomRequest? – FewFlyBy

0

Вам нужно только проверить уникальный первичный ключ в методе создания, в методе обновления вам не нужно снова проверять уникальность, так как он определенно не работает все время.

Если вы обновили существующую запись, которая была проверена уникально в методе создания, то нет необходимости проверять ее снова.

С уважением,

1

Здесь проверьте документацию.

Laravel Unique Validation

Вы можете проигнорировать данное значение. Таким образом, ваша проверка еще может проверить, не является ли она дубликатом, но будет игнорировать это значение.

Смотрите здесь пример:

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

С $ this-> маршрутом («управление»), я получаю идентификатор записи управления, что я в настоящее время пытаюсь обновить. Таким образом, этот идентификатор будет проигнорирован.

Смотрите также мой список маршрутов здесь:

| 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

Я получаю Метод [route] не существует. – FewFlyBy

+0

Вы должны поместить этот код в свой класс Request не в ваш контроллер. http://laravel.com/docs/5.1/validation#other-validation-approaches. Проверка проверки формы проверки. –