如何在Laravel查询中添加验证避免阶段区间重复与重叠?
解决Laravel中区间重复/重叠的查询问题
你原代码的问题在于查询逻辑覆盖不全,而且whereBetweenColumn的用法有误,导致无法检测到所有冲突情况。
要实现"禁止添加重复区间、完全被包含的区间、部分重叠的区间"的需求,核心是判断已有区间和新区间是否存在重叠或完全匹配,通用的区间重叠判断公式是:
已有区间的
from≤ 新区间的to且 已有区间的to≥ 新区间的from
用Laravel查询构造器实现这个逻辑即可覆盖所有冲突场景:
$newFrom = $request->from; $newTo = $request->to; // 检查是否存在冲突的区间记录 $isExist = Stage::where(function ($query) use ($newFrom, $newTo) { $query->where('from', '<=', $newTo) ->where('to', '>=', $newFrom); })->exists(); if ($isExist) { // 存在冲突,禁止添加的逻辑 return response()->json(['message' => '该区间与已有区间重复或重叠,无法添加'], 400); } // 无冲突,执行添加逻辑
逻辑说明
这个查询会检测所有和新区间有交集的已有记录:
- 完全相同的区间(如已有1-10,新增1-10):满足
1<=10且10>=1,会被检测到 - 新区间被已有区间包含(如已有1-10,新增5-7):满足
1<=7且10>=5,会被检测到 - 已有区间被新区间包含(如已有5-7,新增1-10):满足
5<=10且7>=1,会被检测到 - 部分重叠的区间(如已有1-5,新增3-8):满足
1<=8且5>=3,会被检测到
原代码的问题分析
whereBetween('from', [$request->from, $request->to]):仅检测已有区间的from落在新区间内的情况,无法覆盖"已有区间包含新区间"等场景orWhereBetweenColumn('to','from', [$request->from, $request->to]):whereBetweenColumn的正确用法是whereBetweenColumn('列名', '起始列', '结束列'),用于判断某列的值是否在另外两列的区间内,你这里的参数顺序和用法完全错误,导致这部分逻辑无效
内容的提问来源于stack exchange,提问作者Athsal KJ
相关产品推荐
相关产品推荐

