我想验证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);
});
});
})
提前感谢您的时间和帮助。
答案 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()
注意:数据库字段必须为日期或时间戳