Laravel - 在编辑视图上添加日期验证

Posted

技术标签:

【中文标题】Laravel - 在编辑视图上添加日期验证【英文标题】:Laravel - Adding date validation on edit view 【发布时间】:2020-06-10 10:51:18 【问题描述】:

我有两张桌子——“旅行”和“活动”。一次旅行可以有很多事件。我有一个表单,允许用户将事件添加到他们的旅行中。我还有一个允许用户编辑事件的表单。

我在添加和事件时添加了一个检查。只有当活动的开始日期和结束日期在行程开始日期和行程结束日期之间时,才能添加该活动。

但是,我似乎无法在编辑视图上进行相同的检查。使用与我在编辑中添加的代码相同的代码,如果用户更改了活动的时间但未更改活动的开始/结束时间,则会出现日期错误消息 - 即使日期在行程内。

EventController - 添加正在运行的功能

public function addEvent(Request $request)

  $this->validate($request, [
    'event_name'  => 'required',
    'start_date'  => 'required',
    'end_date'    => 'required',
    'time'        => 'required',
    'trip_id'     => 'required',

  ]);

    $start_date = Carbon::parse($request['start_date'])->format('Y-m-d');
    $end_date = Carbon::parse($request['end_date'])->format('Y-m-d');

    $tripCheck = Trip::where('id', $request['trip_id'])
    ->whereDate('startdate', '<=', $start_date)
    ->whereDate('enddate', '>=', $start_date)

    ->whereDate('startdate', '<=', $end_date)
    ->whereDate('enddate', '>=', $end_date)
    ->first();

    if ($tripCheck) 

      $events = new Events;
      $trips = Trip::all();
      $categories = Categories::pluck('category','id');
      $events->category_id = $request['category_id'];
      $events->colour =  $request['colour'];
      $events->event_name = $request['event_name'];
      $events->start_date = $request['start_date'];
      $events->end_date = $request['end_date'];
      $events->time = $request['time'];
      $events->address = $request['address'];
      $events->notes = $request['notes'];
      $events->trip_id = $request['trip_id'];
      $events->save();

return redirect('trips')->with('success', 'The new event has been added to your trip')->with('trips', $trips)->withCategories($categories);
 else
  
  return redirect('trips')->withErrors(['The dates you added are not within Trip start and end date.']);
   

事件控制器编辑功能不起作用

public function edit($id)

  $events = Events::find($id);
  $categories = Categories::pluck('category','id');
  return view ('editEventForm')->with('events', $events)->withCategories($categories);


public function update(Request $request, $id)

    $this->validate($request, [
      'category_id' => 'required',
      'event_name' => 'required',
      'start_date' => 'required',
      'end_date' => 'required',
    ]);

    $start_date = Carbon::parse($request['start_date'])->format('Y-m-d');
    $end_date = Carbon::parse($request['end_date'])->format('Y-m-d');

    $tripCheck = Trip::where('id', $request['trip_id'])
    ->whereDate('startdate', '<=', $start_date)
    ->whereDate('enddate', '>=', $start_date)

    ->whereDate('startdate', '<=', $end_date)
    ->whereDate('enddate', '>=', $end_date)
    ->first();

    if($tripCheck) 

    //Update Event
    $events = Events::find($id);
    $events->category_id = $request['category_id'];
    $events->colour =  $request['colour'];
    $events->event_name = $request['event_name'];
    $events->start_date = $request['start_date'];
    $events->end_date = $request['end_date'];
    $events->time = $request['time'];
    $events->address = $request['address'];
    $events->notes = $request['notes'];
    $events->save();

    return redirect('trips')->with('success', 'Event Updated');
 else 
    return redirect('trips')->withErrors(['The dates you added are not within Trip start and end date.']);

trip.blade.php

<div class="form-group">
      <input type="text" name="destination" class="form-control" value="$trip->destination" placeholder="Destination" />
    </div>
    <h7>Trip Start Date: </h7>
    <div class="form-group">
      <input type="date" name="startdate" class="form-control" value="$trip->startdate" placeholder="Start Date" />
    </div>
    <h7>Trip End Date: </h7>
    <div class="form-group">
      <input type="date" name="enddate" class="form-control" value="$trip->enddate" placeholder="End Date" />
    </div>
    <div>

行程控制器

public function submit(Request $request)
  $this->validate($request, [
    'name'          => 'required',
    'email'         => 'required',
    'destination'   => 'required',
    'startdate'     => 'required',
    'enddate'       => 'required'
  ]);

  //Create new trips
  $trip = new Trip;
  $trip->name = $request->input('name');
  $trip->email = $request->input('email');
  $trip->destination = $request->input('destination');
  $trip->startdate = $request->input('startdate');
  $trip->enddate = $request->input('enddate');
  $trip->user_id = auth()->user()->id;

  //save trips
  $trip->save();

  //Rredirect
  return redirect('/home')->with('status', 'Trip Created Sucessfully');


【问题讨论】:

【参考方案1】:

update 方法正在寻找$request['trip_id'],它存在吗?它不像 create 方法那样在所需的验证中。

在您的更新表单中吗?

还有一个额外的提示,您可以通过在模型对象上使用 createfill 来简化很多代码。

即:$trip = Trip::create($request-&gt;input()); 假设输入名称与模型匹配并且输入是干净的。

【讨论】:

@Laura 如果您使用$trip = Trip::create($request-&gt;input());,有人会在您的查询中发送“user_id”输入并将事情搞砸。永远不要相信用户输入,像你一样逐个获取属性是一种更好/更安全的方法 这就是验证规则的用途。 验证规则不对缺少的规则进行测试。您将添加什么规则来防止诸如“updated_at”、“deleted_at”、“user_id”之类的属性...... 它们将是受保护的属性。但是这里不需要这个讨论。考虑一下。

以上是关于Laravel - 在编辑视图上添加日期验证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Inertia JS 在 Laravel 中默认编辑或删除身份验证的 URL?

在 Laravel 4.2 中保护视图的最有效方法是啥?

将行添加到可编辑的网格视图后,日期选择器未出现

如何在验证 laravel 中设置比较日期时间?

Laravel 4:在验证之前和之后验证开始和结束日期

之后:日期不接受 Laravel 表单验证中的相同日期?