我有一个工作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是必需的,并且应该是唯一的。我的问题是,这是更新代码。如果我只是想更新一些字段,比如price
或type
呢?每当我更新一个字段时,我总是在我的视图中得到The room number has already been taken.
,因为是的,roomNumber在我的验证中应该是唯一的。
我如何更新一个特定的字段,它仍然会检查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
的情况下更新它?
首先需要创建一个自定义请求类,如下所示。你可以把它放在一个名为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方法中被检查唯一的记录,那么不需要再检查它。
认为,