You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多对多关系验证:用户课程报名时间冲突校验需求

解决方案

核心思路

要实现这个校验,关键是对比当前用户已报名的课程与目标课程是否满足「同一天、同一时间、时间范围重叠」三个条件。具体步骤:

  1. 获取目标课程的day、time、start_date、end_date信息
  2. 查询该用户已报名的课程中,是否存在同时符合三个条件的课程
  3. 若存在冲突课程,返回错误;反之允许报名

底层SQL实现

先获取目标课程的核心字段:

SELECT day, time, start_date, end_date FROM courses WHERE id = :course_id;

再查询是否存在冲突课程(:user_id为当前登录用户ID,:target_*为目标课程的对应字段):

SELECT COUNT(*) 
FROM user_courses uc
JOIN courses c ON uc.course_id = c.id
WHERE uc.user_id = :user_id
  AND c.day = :target_day
  AND c.time = :target_time
  AND c.start_date <= :target_end_date
  AND c.end_date >= :target_start_date;

时间重叠判断逻辑:已报名课程的开始时间 ≤ 目标课程结束时间,且已报名课程的结束时间 ≥ 目标课程开始时间,只要满足这个条件,两个时间段就存在重叠。


主流框架示例

Laravel(Eloquent ORM)

// 获取目标课程
$targetCourse = \App\Models\Course::findOrFail($courseId);

// 检查是否存在冲突课程
$hasConflict = \App\Models\UserCourse::where('user_id', $userId)
    ->join('courses', 'user_courses.course_id', '=', 'courses.id')
    ->where('courses.day', $targetCourse->day)
    ->where('courses.time', $targetCourse->time)
    ->where('courses.start_date', '<=', $targetCourse->end_date)
    ->where('courses.end_date', '>=', $targetCourse->start_date)
    ->exists();

if ($hasConflict) {
    return response()->json([
        'error' => '无法报名该课程,您已报有同一天同一时间且时间范围重叠的课程'
    ], 400);
}

// 无冲突,执行报名逻辑(如创建UserCourse记录)

Django(ORM)

from django.http import JsonResponse
from .models import Course, UserCourse

# 获取目标课程
target_course = Course.objects.get(id=course_id)

# 查询冲突课程
has_conflict = UserCourse.objects.filter(
    user_id=user_id
).filter(
    course__day=target_course.day,
    course__time=target_course.time,
    course__start_date__lte=target_course.end_date,
    course__end_date__gte=target_course.start_date
).exists()

if has_conflict:
    return JsonResponse({
        'error': '无法报名该课程,您已报有同一天同一时间且时间范围重叠的课程'
    }, status=400)

# 无冲突,执行报名逻辑

注意事项

  • 确保courses表的start_date、end_date字段为日期类型(如DATE/DATETIME),避免字符串比较导致的逻辑错误
  • 高并发场景下,建议用数据库事务包裹「校验+报名」逻辑,防止竞态条件(多个请求同时通过校验后插入冲突记录)
  • 可将校验逻辑封装为独立函数/方法,便于在多个接口中复用

内容的提问来源于stack exchange,提问作者Mohamed Helmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:33:19