Проверить дату не между массивом диапазона дат - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь подтвердить это:

"Человек не может взять отпуск в определенный диапазон дат, если эта дата уже была взята"

Итак, если у меня есть что-то подобное в таблице отпусков

start_date  |  end_date  | duration_days | user_id
--------------------------------------------------
 01-01-2019 | 01-02-2019 |      30       |   1
 03-02-2019 | 28-02-2019 |      15       |   2
 12-12-2019 | 01-01-2020 |      20       |   3

Как видите, весь диапазон дат взаимоисключающий

И если я хочу добавить еще одну строку, я должен подтвердить это (я думаю, что, если я ошибаюсь, пожалуйста, исправьте меня):

  • start_date - не в :

    [{01-01-2019;01-02-2019}, {03-02-2019;28-02-2019}, {03-02-2019;28-02-2019}].

  • end_date is not in :

    [{01-01-2019;01-02-2019}, {03-02-2019;28-02-2019}, {03-02-2019;28-02-2019}].

Перенос всей этой логики в laravel в VacationController store:

public function store(Request $request, $user_id)
{
        $dates_taken = Vacation::all('start_date', 'end_date');

        $request->validate([
            'start_date' => 'required|date|not_in:'.$dates_taken,
            'end_date' => 'required|date|not_in:'.$dates_taken',
        ]);
}

Я знаю, что проверка неверна, но я хотел понять проблему.

Есть какой-то способ сделать это с помощью проверки ларавеллы ?

Ответы [ 3 ]

3 голосов
/ 15 июня 2019

Вы должны использовать пользовательскую проверку и можете определить свое пользовательское правило, используя Validator::extend() как:

Validator::extend('exclude_pre_leaves', function ($attribute, $value, $p, $validator) {
    $data = $validator->getData();
    $hasMached = Vacation::where('start_date', '>=', $data[$p[0]])
                            ->where('end_date','<=', $data[$p[0]])
                            ->orWhere(function($q) use($p, $data){
                                        $q->where('start_date', '>=', $data[$p[1]])
                                          ->where('end_date','<=', $data[$p[1]]);
                            })->count();

    return $hasMatched == 0;
});

И вы можете использовать это как:

$request->validate([
    'start_date' => 'required|date|exclude_pre_leaves:start_date,end_date',
    'end_date' => 'required|date|exclude_pre_leaves:start_date,end_date'
]);

1 голос
/ 16 июня 2019

Существует опция для создания наших собственных правил, поэтому

php artisan make:rule VacationDateRule

Это создаст новый файл с именем

VacationDateRule.phpвнутри App\Rules Каталог

После этого я рассматриваю вашу модель как Отпуск

Скопируйте и вставьте файл правил

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\Vacation;

class VacationDateRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct($form ,$to ,$userid)
    {
        $this->form = $form; 
        $this->to = $to;
        $this->userid = $userid;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $vacation = Vacation::where('start_date','>=',$this->form)
                            ->where('end_date','<=',$this->to)->count();
        $vacation === 0 ? true : false ;
        //
    }

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

и впроверка

 $request->validate([
        'start_date' => ['required|date',new VacationDateRule(
            $request->start_date,
            $request->start_date,
            $request->user_id)],
        'end_date' => 'required|date',
    ]);

Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте ниже

0 голосов
/ 15 июня 2019

Используйте свою собственную проверку, как вы хотите.реализовать свой собственный алгоритм проверки

 $validationarray = $this->validate($request,
            [
                'start_date'  => [
                    'required',
                    'date',
                    function ($attribute, $value, $fail) { 
                        //$attribute->input name, $value for that value.
                        //or your own way to collect data. then check.
                        //make your own condition.
                        if($this->dateBetween($value)) {                        
                             $fail($attribute.' is failed custom rule. The date is not acceptable.');
                        }
                    },          
                ],    
                'end_date'  => [
                    'required',
                    'date',
                    function ($attribute, $value, $fail) { 
                        //$attribute->input name, $value for that value.
                        //or your own way to collect data. then check.
                        //make your own condition.
                        if($this->dateBetween($value)) {                        
                             $fail($attribute.' is failed custom rule. The date is not acceptable.');
                        }
                    },          
                ],   
            ]);

Написать функцию в тот же класс.Потому что я использовал его для проверки.

public function dateBetween($date){
    if(checkDateAsDesired) return true;
    else return false;   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...