我正在从用户那里接收'make'、'model'、'fromyear'和'todyear'的输入.我想阻止用户输入一个'fromyear'和'toyear'范围,这些范围已经存在于数据库中,用于给定的'make'和'model'.

例如,如果数据库中有一个记录,其中'make'为'Toyota','model'为'Camry','fromyear'为2015,'toyear'为2020,则不允许用户输入以下范围:

  • 2016年到2017
  • 2016至2018
  • 2019年至2022
  • 2013年到2016

但是,如果"fromyear"和"toyear"不在数据库中的任何现有范围内,则应允许用户输入它们.

数据库表有名为"make"、"model"、"fromyear"和"toyear"的列.

$has_range = PartsList::where('make', $request->make)
    ->where('model', $request->model)
    ->where(function ($query) use ($request) {
        $query->whereBetween('fromyear', [$request->fromyear, $request->toyear])
            ->orWhereBetween('toyear', [$request->fromyear, $request->toyear]);
    })
    ->exists();

if ($has_range) {
    $msg = 'year range already exists for this make and model';
}

推荐答案

为了确保捕捉到任何类型的重叠,您需要调整逻辑以考虑所有可能的重叠场景:

  1. 用户的自年在任何现有范围内.
  2. 用户今年的时间在任何现有范围内.
  3. 用户的范围完全包含现有范围.
  4. 现有的范围完全涵盖了用户的范围.

以下是您如何调整查询以涵盖所有这些情况:

$has_range = PartsList::where('make', $request->make)
    ->where('model', $request->model)
    ->where(function ($query) use ($request) {
        // Case 1: User's fromyear is within an existing range.
        $query->where(function($q) use ($request) {
            $q->where('fromyear', '<=', $request->fromyear)
              ->where('toyear', '>=', $request->fromyear);
        })
        // Case 2: User's toyear is within an existing range.
        ->orWhere(function($q) use ($request) {
            $q->where('fromyear', '<=', $request->toyear)
              ->where('toyear', '>=', $request->toyear);
        })
        // Case 3: User's range encompasses an existing range.
        ->orWhere(function($q) use ($request) {
            $q->where('fromyear', '>=', $request->fromyear)
              ->where('toyear', '<=', $request->toyear);
        })
        // Case 4: An existing range encompasses the user's range (this might actually be redundant given the first two checks, but added for clarity).
        ->orWhere(function($q) use ($request) {
            $q->where('fromyear', '<=', $request->fromyear)
              ->where('toyear', '>=', $request->toyear);
        });
    })
    ->exists();

if ($has_range) {
    $msg = 'The year range already exists for this make and model.';
}

Php相关问答推荐

当我们使用PHPUnit时,控制台中的--uses param到底起了什么作用以及如何使用?

Laravel通过(扩展FormRequest类)方法验证表单请求

PHP DOMDocument忽略第一个表S结束标记

如何显示每个分类的当前术语的帖子中包含的前20个标签,不包括标签分类

由于某种原因,FILE_GET_CONTENTS从一天到另一天停止工作,并在PHP 7.2.34中返回一条&http/1.1 406不能接受&的错误

在WooCommerce获取所有具有全球产品属性品牌的简单产品

在WooCommerce中添加特定产品类型的百分比费用和固定费用

基于服务器的不同地平线配置

函数存储到变量中

如果WooCommerce购物车在 checkout 时被清空,请重定向至store 页面

如何解决 Laravel 外键错误?

在 PHP MySQL 中自动生成账单编号

将图像作为 PHP post 响应发送到浏览器

从插件更改主题功能,function_exists 不起作用

加载 Xdebug PHP 7.4.0 失败

如何使用在产品快速编辑菜单前端的自定义框中 Select 的值更新 woocommerce 产品属性值?

如何在不解压缩/重新压缩的情况下连接(连接)两个缩小的值

从 laravel 中的日期类型中删除时间

使用 splat 运算符时按引用传递 (...)

基于其他数组创建多维数组 struct