在创建时验证laravel中重叠的日期

时间:2019-01-15 19:32:55

标签: laravel validation date unique laravel-nova

我想验证laravel中任何重叠的日期都没有重复的行。我在数据库中有2列具有DATE数据类型的valid_from_datevalid_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_datevalid_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);
                                                    });
                                                });
                                    })

提前感谢您的时间和帮助。

3 个答案:

答案 0 :(得分:1)

使用的逻辑是
情况1:
 输入(valid_until_date)位于数据库(valid_from_date,valid_until_date)之间或输入(valid_from_date)位于数据库(valid_from_date,valid_until_date)之间
情况2:
情况相反或处于第二种情况下的情况
输入(valid_from_date)位于数据库(valid_from_date,valid_until_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);
                                                            })

                                                               })
                                                               });

答案 1 :(得分:0)

我使用Rule :: notIn($ array)实现了此目标,该$ array的所有日期都在valid_from_date和valid_until_date之间。

答案 2 :(得分:0)

这对我有用:

Reservation::whereBetween('date_start', [Carbon::parse($this->date_start), Carbon::parse($this->date_end)])->count()

注意:数据库字段必须为日期或时间戳