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

Validate overlapping dates in laravel while creating

我想验证 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);
                                                    });
                                                });
                                    })

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

使用的逻辑是
案例 1:
input(valid_until_date) 位于 database(valid_from_date,valid_until_date) 之间或 input(valid_from_date) 位于 database(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);
                                                            })

                                                               })
                                                               });

我使用 Rule::notIn($array) 实现了这一点,这个 $array 具有 valid_from_date 和 valid_until_date 之间的所有日期。

这对我有用:

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

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