Laravel验证控制器存储中的变量

时间:2018-03-20 14:00:14

标签: php mysql laravel validation

我无法在我的问题上找到答案,所以我希望有人可以帮助我

我想验证我是否添加了一个新约会,表明在约会当天没有选择所选员工。所以我不能在一天内对某人进行双重预订。 我使用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);
}

我希望有人可以提供帮助

3 个答案:

答案 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(),并且不会插入数据。

考虑到这一点,如果验证通过意外,最好有后备,在这种情况下uniqueemployee_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'
]);