Проверяйте перекрывающиеся даты в laravel при создании - PullRequest
0 голосов
/ 15 января 2019

Я хочу проверить, что в перекрывающихся датах в laravel нет повторяющейся строки. У меня есть 2 столбца в базе данных с типом данных DATE, valid_from_date и valid_until_date.

Предположим, valid_from_date = 2019-01-01 и valid_until_date = 2019-01-31, я не хочу, чтобы пользователь вводил какие-либо даты между этими днями.

Неверные примеры: не должны приниматься

valid_from_date = 2018-12-01 and valid_until_date = 2019-01-02
valid_from_date = 2019-01-04 and valid_until_date = 2019-01-29
valid_from_date = 2019-01-15 and valid_until_date = 2019-02-05

Примеры действительных случаев: Может быть принят

valid_from_date = 2018-12-02 and valid_until_date = 2018-12-31
valid_from_date = 2019-02-05 and valid_until_date = 2019-02-25

Точно, любая дата ввода, которая находится между этими двумя датами, не должна приниматься как valid_from_date или valid_until_date.

Я попытался сделать это с Rule :: unique следующим образом, также пробовал много других способов запроса.

Rule::unique('users')->where(function ($query) use ($request) {
                                          return $query->where('user_id', $request->user_id)
                                         ->where(function($q1) use ($request) {
                                          $q1->where(function($q2) use ($request) {
                                          $q2->where('valid_from_date', '<=', $request->valid_from_date)
                                          ->where('valid_until_date', '>=', $request->valid_from_date);
                                                    })
                                          ->orWhere(function($q2) use ($request) {
                                          $q2->where('valid_from_date', '<=', $request->valid_until_date)
                                          ->where('valid_until_date', '>=', $request->valid_until_date);
                                                    });
                                                });
                                    })

Заранее спасибо за ваше время и помощь.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Я достиг этого, используя Rule :: notIn ($ array), этот массив $ имеет все даты между valid_from_date и valid_until_date.

0 голосов
/ 16 января 2019

Логика используется
дело 1:
input (valid_until_date) лежит между базой данных (valid_from_date, valid_until_date) или input (valid_from_date) лежит между базой данных (valid_from_date, valid_until_date)
вариант 2:
обратный или условие во втором случае
вход (valid_from_date) лежит между базой данных (valid_from_date, valid_until_date) или вход (valid_until_date) лежит между базой данных (valid_from_date, valid_until_date)

Rule::unique('users')->where(function ($query) use ($request) {
                                     return $query->where('user_id', $request->user_id)
                                     ->where(function ($query1) use ($request) {
                                                 $query1->where('valid_from_date', '>=', $request->valid_from_date)
                                                        ->where('valid_until_date', '<=', $request->valid_from_date)
                                                        ->orWhere(function ($query2) use ($request) {
                                                 $query2->where('valid_from_date', '>=', $request->valid_until_date)
                                                        ->where('valid_until_date', '<=', $request->valid_until_date);
                                                            })

                                                               })
                                    ->where(function ($query3) {
                                                 $query3->orWhere('valid_from_date', '>=', $request->valid_from_date)
                                                        ->where('valid_until_date', '<=', $request->valid_from_date)
                                                        ->where(function ($query4) use ($request) {
                                                 $query4->where('valid_from_date', '>=', $request->valid_until_date)
                                                        ->where('valid_until_date', '<=', $request->valid_until_date);
                                                            })

                                                               })
                                                               });
...