wolfrogers
wolfrogers

Reputation: 21

Laravel validation rules for time

How do I make validation rules for if the start_date and end_date are equal only validate that the end time must be greater than start time.

    $rules = [
        'start_date' => 'required|date_format:Y-m-d',
        'end_date' => 'required|date_format:Y-m-d|after_or_equal:start_date',
            'start_time' => 'nullable|date_format:H:ia',
            'end_time' => 'nullable|date_format:H:ia|after:start_time'
        ];

Upvotes: 0

Views: 592

Answers (1)

John Lobo
John Lobo

Reputation: 15319

You can create custom validation for that

<?php

namespace App\Rules;

use Carbon\Carbon;
use Illuminate\Contracts\Validation\Rule;

class EndTime implements Rule
{
    private $startDate;
    private $endDate;
    private $startTime;
    private $endTime;

    /**
     * Create a new rule instance.
     *
     * @param $startDate
     * @param $endDate
     * @param $startTime
     * @param $endTime
     */
    public function __construct($startDate,$endDate,$startTime,$endTime)
    {
        //
        $this->startDate = $startDate;
        $this->endDate = $endDate;
        $this->startTime = $startTime;
        $this->endTime = $endTime;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $startDate=Carbon::createFromFormat('Y-m-d',$this->startDate);
        $endDate=Carbon::createFromFormat('Y-m-d',$this->endDate);
        $startTime = Carbon::createFromFormat('H:ia',$this->startTime);
        $endTime = Carbon::createFromFormat('H:ia',$this->endTime);
        if($startDate==$endDate &&$endTime<$startTime){

            return false;
        }

        return true;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}

and in your rule

 $rules = [
        'start_date' => 'required|date_format:Y-m-d',
        'end_date' => 'required|date_format:Y-m-d|after_or_equal:start_date',
        'start_time' => 'nullable|date_format:H:ia',
        'end_time' => ['nullable', 'date_format:H:ia',new EndTime($request->start_date,$request->end_date,$request->start_time,$request->end_time)]
    ];

Upvotes: 1

Related Questions