我在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是必需的,应该是唯一的。我的问题是,这是更新代码。如果我只想更新price
或type
等字段,该怎么办?每当我更新一个字段时,我总是在我的视图中得到The room number has already been taken.
,因为是的,roomNumber在我的验证中应该是唯一的。
如何更新仍会检查room number
是否唯一的特定字段,但如果我正在更新的数据位于同一字段中,则只会更新其他字段,例如{{1}和type
?如果我的问题含糊不清,请纠正我。谢谢!
示例:
我的房间表中有2个数据
price
现在,如果我将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
,因为它还会验证{我更新时{1}}如果我正在更新的数据相同,如何在不验证The room number has already been taken.
的情况下更新它?
答案 0 :(得分:4)
首先需要创建一个自定义请求类,如下所示。您可以将其放在名为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。
答案 1 :(得分:1)
请查看文档。
您可以忽略给定的值。因此,您的验证仍然可以检查它是否不重复,但会忽略该值。
见这里的例子:
'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
答案 2 :(得分:0)
您只需要在create方法中验证唯一的主键,在update方法中,您不必再次验证唯一性,因为它肯定会一直失败。
如果您更新在create method中已检查唯一的现有记录,则无需再次检查。
此致