创建时验证 laravel 中的重叠日期
Validate overlapping dates in laravel while creating
我想验证 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);
});
});
})
提前感谢您的宝贵时间和帮助。
使用的逻辑是
案例 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()
注意:数据库字段必须是日期或时间戳
我想验证 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);
});
});
})
提前感谢您的宝贵时间和帮助。
使用的逻辑是
案例 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()
注意:数据库字段必须是日期或时间戳