我无法在我的问题上找到答案,所以我希望有人可以帮助我
我想验证我是否添加了一个新约会,表明在约会当天没有选择所选员工。所以我不能在一天内对某人进行双重预订。 我使用laravel 5.6和MySQL与表约会使用以下行: id,day,employee_id和resource_id
我的控制器是一个资源控制器(带索引,创建,存储,...功能)。
因此,如果$ appointmentExists为1,我需要抛出错误并保持在创建表单的同一页面。
public function store(Request $request)
{
$appointmentExist = \DB::table('appointments')
->where([
['day','=',$request->day],
['employee_id','=',$request->employee_id],
])
->exists();
$request->validate([
'day' => 'required|min:1|max:10',
'employee_id' => 'required',
'resource_id' => 'required',
$appointmentExist => 'in:0',
]);
$appointment = Appointment::create(['day' => $request->day, 'employee_id' => $request->employee_id, 'resource_id' => $request->resource_id]);
return redirect('/appointments/' . $appointment->id);
}
我希望有人可以提供帮助
答案 0 :(得分:1)
所以我自己找到了答案,也许其他人可以使用它:
Public Sub DrawSVGinWebBrowserControl()
Dim text As String = XSchemaSVG.InnerXml
WebBrowser1.DocumentText = "<!DOCTYPE HTML><html><head><meta http-equiv=""x-ua-compatible"" content=""IE=11""><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8""><title>SVG overzicht</title> </head><body>" & text & "</body></html>"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Clear XSchemaSVG
XSchemaSVG.RemoveAll()
'Draw new SVG in XSchemaSVG
DrawOverzichtSVG()
'load new SVG in webbrowser control
DrawSVGinWebBrowserControl()
End Sub
所以现在我回答错误&#39;这位员工已经忙碌了一天,...&#39;。 我还没有找到如何从$ request-&gt; validate()返回错误,但在这种情况下我不需要这样做。如果您知道,请随时告诉我。
答案 1 :(得分:1)
你的问题就在这一行:
$appointmentExist => 'in:0',
我们会检查in_array($request->input($appointmentExist), [0])
,但$request->input($appointmentExist)
会检查$request->input(0)
或$request->input(1)
,这两种技术都不存在。
我会改为使用Request添加:
$exists = \DB::table(...)->exists(); // Same query, just assigned to a variable
$request->request->add(["exists", $exists]);
$request->validate([
...,
"exists" => "in:0"
]);
通过将密钥"exists"
添加到请求有效负载,您可以像在请求中发送实际数据一样对其进行验证,并立即返回所有错误。
按照@ N.B。的评论,上述情况只会阻止这种情况的双重预订;如果验证失败,将永远不会调用Appointment::create()
,并且不会插入数据。
考虑到这一点,如果验证通过意外,最好有后备,在这种情况下unique
与employee_id
组合的day
约束,如果你真的想要防止双重预订,并按照这样处理:
try {
Appointment::create(...);
catch (\Illuminate\Database\QueryException $qex){
\Log::error("Unable to Create Appointment: ".$qex->getMessage());
// Handle individual codes
if($qex->getCode() == "23000"){
return redirect()->back()->withErrors(...);
}
}
答案 2 :(得分:0)
$request->validate([
'day' => 'required|min:1|max:10',
'employee_id' => 'required',
'resource_id' => 'required',
$appointmentExist => 'in:0',
]);
此无效代码。 Validator将在请求数据中搜索1或0($ appointmentExist)。这些密钥永远不会包含在此请求中。
尝试使用Rule类。例如:
$day = $request->day;
$request->validate([
'day' => 'required|min:1|max:10',
'employee_id' => [
'required',
Rule::unique('appointments')->where(function ($query) use ($day) {
return $query->where('day', $day);
})
],
'resource_id' => 'required'
]);