Laravel - избежание двойного бронирования временных интервалов - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь понять, как добавить некоторую форму проверки, чтобы один и тот же игровой автомат не мог быть забронирован дважды в одну и ту же дату. Любые советы приветствуются.

Приведенный ниже код показывает, как создать бронирование, в настоящее время у пользователя есть набор параметров в форме для выбора временного интервала театра в поле TheatreRoomID. Дата выбирается с помощью формы :: Ввод даты.

Бронирования - Create.blade. php

@extends('layouts.app')
@section('content')
<hr>
<h1>Booking Form</h1>
<hr>
{!! Form::open(['action' => 'BookingFormsController@store', 'method' => 'POST']) !!}

<div class="form-group">
{{Form::label('requestID', 'Request ID')}}
{{Form::number('requestID', $patientDetail->requestID, ['class' => 'form-control',])}}
</div>

<div class="form-group">
{{Form::label('requestDate', 'Request Date')}}
{{Form::date('requestDate', $patientDetail->requestDate, ['class' => 'form-control'])}}
</div>

<div class="form-group">
{{Form::label('patientID', 'Patient ID')}}
{{Form::number('patientID', $patientDetail->patientID, ['class' => 'form-control'])}}
</div>

<div class="form-group">
{{Form::label('patientForename', 'Patient Forename')}}
{{Form::text('patientForename', $patientDetail->patientForename, ['class' => 'form-control'])}}
</div>

<div class="form-group">
{{Form::label('patientSurname', 'Patient Surname')}}
{{Form::text('patientSurname', $patientDetail->patientSurname, ['class' => 'form-control',])}}
</div>

<div class="form-group">
{{Form::label('patientSex', 'Patient Sex')}}
{{Form::text('patientSex', $patientDetail->patientSex, ['class' => 'form-control', 'placeholder' => ''])}}
</div>

<div class="form-group">
{{Form::label('patientDOB', 'Patient DOB')}}
{{Form::date('patientDOB', $patientDetail->patientDOB, ['class' => 'form-control','placeholder' => ''])}}
</div>

<div class="form-group">
{{Form::label('patientUrgency', 'Patient Urgency')}}
{{Form::text('patientUrgency', $patientDetail->patientUrgency, ['class' => 'form-control','placeholder' => ''])}}
</div>

<div class="form-group">
{{Form::label('TheatreRoomID', 'Theatre Room')}}
{{Form::select('TheatreRoomID', ['Room 1 - Time: 9:00AM - 11:00AM' => 'Room 1 - Time: 9:00AM - 11:00AM',
                                'Room 1 - Time: 12:00PM -2:00PM' => 'Room 1 - Time: 12:00PM - 2:00PM',
                                'Room 1 - Time: 3:00PM - 5:00PM' => 'Room 1 - Time: 3:00PM - 5:00PM',
                                'Room 2 - Time: 9:00AM - 11:00AM' => 'Room 2 - Time: 9:00AM - 11AM',
                                'Room 2 - Time: 12:00PM - 2:00PM' => 'Room 2 - Time: 12:00PM - 2:00PM',
                                'Room 2 - Time: 3:00PM - 5:00PM' => 'Room 2 - Time: 3:00PM - 5:00PM',
                                'Room 3 - Time: 9:00AM - 11:00AM' => 'Room 3 - Time: 9:00AM - 11:00AM',
                                'Room 3 - Time: 12:00PM - 2:00PM' => 'Room 3 - Time: 12:00PM - 2:00PM',
                                'Room 3 - Time: 3:00PM - 5:00PM' => 'Room 3 - Time: 3:00PM - 5:00PM'

                                ], null, ['class' => 'form-control','placeholder' => 'Select Theatre Slot'])}}
</div>

<div class="form-group">
{{Form::label('surgeryType', 'Surgery Type')}}
{{Form::text('surgeryType', $patientDetail->surgeryType, ['class' => 'form-control','placeholder' => ''])}}
</div>

<div class="form-group">
  {{Form::label('surgeryDate', 'Surgery Date')}}
  {{Form::date('surgeryDate')}}
</div>

<div class="form-group">
  {{Form::label('performingSurgeon', 'Peforming Surgeon')}}
  {{Form::select('performingSurgeon', ['Wendy clarke' => 'Wendy Clarke', 'John Kennedy' => 'John Kennedy', 'Imran Yousuf' => 'Imran Yousuf', 'Merideth Grey' => 'Merideth Grey', 'Derek Shepherd' => 'Derek Shepherd'], null, ['class' => 'form-control','placeholder' => ''])}}
</div>

<div class="form-group">
{{Form::label('bloodGroup', 'Blood Group')}}
{{Form::select('bloodGroup', ['A' => 'A', 'B' => 'B', 'O' => 'O', 'AB' => 'AB'], null, ['class' => 'form-control','placeholder' => $patientDetail->bloodGroup])}}
</div>

<div class="form-group">
  {{Form::label('patientNotes', 'Patient Notes')}}
  {{Form::textarea('patientNotes', '', ['class' => 'form-control', 'placeholder' => 'Enter any other neccessary patient details'])}}
</div>

<div class="btn-toolbar">
  <a href="javascript:history.back()" class="btn btn-danger mr-3">Back</a>
  {{Form::submit('Submit Booking', ['class'=> 'btn btn-success mr-3'])}}
</div>
{!! Form::close() !!}
@endsection

BookingFormController:

public function create()
{
    return view('bookingforms.create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $booking)
{
  $this->validate($booking, [
  'requestID' => 'required',
  'patientID' => 'required',
  'patientForename' => 'required',
  'patientSurname'=> 'required',
  'patientSex' => 'required',
  'patientDOB' => 'required',
  'surgeryType' => 'required',
  'surgeryDate' => 'required',
  'performingSurgeon' => 'required',
  'TheatreRoomID' => 'required',
  'patientUrgency' => 'required',
  'patientNotes' => 'required',
  'bloodGroup' => 'required'
  ]);

  // Create new Booking Form
  $bookingform = new Bookingform;
  $bookingform->requestID = $booking->input('requestID');
  $bookingform->bookingID = $booking->input('bookingID');
  $bookingform->patientID = $booking->input('patientID');
  $bookingform->patientForename = $booking->input('patientForename');
  $bookingform->patientSurname = $booking->input('patientSurname');
  $bookingform->patientSex = $booking->input('patientSex');
  $bookingform->patientDOB = $booking->input('patientDOB');
  $bookingform->surgeryType = $booking->input('surgeryType');
  $bookingform->surgeryDate = $booking->input('surgeryDate');
  $bookingform->performingSurgeon = $booking->input('performingSurgeon');
  $bookingform->TheatreRoomID = $booking->input('TheatreRoomID');
  $bookingform->patientUrgency = $booking->input('patientUrgency');
  $bookingform->patientNotes = $booking->input('patientNotes');
  $bookingform->bloodGroup = $booking->input('bloodGroup');

  //Save Booking form

  $bookingform->save();

  //redirect
  return redirect('/bookingforms')->with('success', 'Booking Submitted');
}

BookingForm. php Модель

    <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BookingForm extends Model
{
  protected $table = 'bookingforms';
  //primary key
  public $primaryKey = 'bookingID';
  //Timestamps
  public $timestamps = true;
}

Структура таблицы BookingForms: см. Здесь структуру таблицы

Я довольно новичок в Laravel, поэтому любые предложения очень ценятся.

1 Ответ

0 голосов
/ 19 апреля 2020

Использование Промежуточного программного обеспечения :

  • Сначала вы определяете промежуточное программное обеспечение с помощью этой команды php artisan make:middleware MiddlewareName

У меня есть уже определите мой с именем CheckTheatre Так что Middleware выполняет фильтрацию HTTP-запросов, поступающих в ваше приложение. Как это :

namespace App\Http\Middleware;

use App\BookingForm;
use Closure;

class CheckTheatre
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
       return BookingForm::where([['surgeryDate',$request->input('surgeryDate')],
            ['TheatreRoomID',$request->input('TheatreRoomID')]])->exists() ? 
            redirect('home'):$next($request);
    }
}

так что эта функция проверяет наличие записи с такой же датой и TheatreRoomID текущего запроса (я предположил, что дата, на которую вы ссылаетесь - surgeryDate) Если есть запись, она перенаправляет его на home, Но , если хотите, вы можете вернуть сообщение об ошибке. А если записи не было, то запрос проходит и вызывается store.

Теперь, после того как вы сделали функцию для обработки запроса, вам нужно сообщить Middleware, какой запрос обрабатывать. Таким образом, в routes.web Вы можете вызвать промежуточное программное обеспечение следующим образом:

Route::post('bookingoffer', 'yourController@store')->middleware('MiddlewareName');

И убедитесь, что вы добавили промежуточное программное обеспечение, которое вы сделали, в app/Http/Kernel.php

Предложение

Читать Массовое назначение & Проверка запроса формы это сделает ваш контроллер намного более читабельным и облегчит кодирование в целом.

...