【问题标题】:Laravel 5 Update ValidationLaravel 5 更新验证
【发布时间】:2015-10-18 08:16:38
【问题描述】:

我在 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 是否唯一的特定字段,但如果我正在更新的数据位于同一字段中,它只会更新其他字段,例如 type 和 @987654327 @?如果我的问题含糊不清,请纠正我。谢谢!

例子:

我的房间表中有 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 的情况下更新它?

【问题讨论】:

  • 抱歉,当您说“..但如果我要更新的数据在同一个字段中,它只会更新其他字段,例如类型和价格”,您能否再澄清一下。能举个例子吗?
  • @codegeek 更新了我的帖子

标签: php laravel laravel-5


【解决方案1】:

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

【讨论】:

  • 未定义变量:房间
  • 查看我的编辑。您需要创建一个请求,然后在控制器中使用
  • 非常感谢!如果这是我的代码pastebin.com/XMRaUYvR,那么当我添加 RoomRequest 时它会是什么样子?
  • 试过了这个类 App\Http\RoomRequest 不存在。我在 Request 文件夹中创建了一个 RoomRequest.php 并放置了您的代码,然后在我的控制器中使用 App\Http\RoomRequest;
  • 没有。将控制器文件和此 RoomRequest.php 文件放在同一个文件夹中。然后命名空间。如果需要,我可以帮助聊天
【解决方案2】:

在这里查看文档。

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 

【讨论】:

【解决方案3】:

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

如果你更新了一个已经在create方法中检查唯一的现有记录,则不需要再次检查。

问候,

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2015-06-08
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2016-10-13
    • 2016-04-06
    相关资源
    最近更新 更多