php - Laravel 在最小-最大过滤器中找到最小-最大工资的一段

标签 php mysql sql laravel

在数据库中,我有一个User表,它有2列:minSalarymaxSalary

在搜索页面我有一个薪水过滤器。所以这是一个 2 点输入类型范围。

<input type="range" name="minSalary" min="0" max="100000" value="3000">
<input type="range" name="maxSalary" min="0" max="100000" value="10000">

当应用该过滤器时,它会转到该 Controller 路由:

$query = User::query();
... //another filters 
        if($request['minSalary'] && $request['maxSalary'])
        {
          $minFilter = (int) $request['minSalary'];
          $maxFilter = (int) $request['maxSalary'];

          $query->whereBetween('minSalary',   [ $minFilter, $maxFilter ])
          ->orWhere(function($query) use ($minFilter,$maxFilter) {
            $query->whereBetween('maxSalary',   [ $minFilter, $maxFilter ]);

          });

        }

让我们注意:

minSalarymaxSalaryUser 表中的列,$minFilter$maxFilter 来自 $_REQUEST

该查询检查最低工资是否在最小和最大过滤器之间,或者最高工资是否在最小和最大过滤器之间。

现在一些例子: 过滤器:3000 - 10000
约翰:3500-5500 - 匹配
Dave:2600 - 4100 - 是一个匹配,因为 maxSalary(4100) 介于 3000-10000 之间
艾琳:7600-11000 - 匹配<因为 minSalary(7600) 介于 3000-10000 之间
安德鲁:2000-11000 - 不匹配,但它必须符合我的逻辑和项目要求。

所以,我发现如果我添加一个附加条件: 如果 $minFilter 介于 minSalarymaxSalary 之间,或者 $maxFilter 介于 minSalarymaxSalary,它会正常工作的。

它必须看起来像:

  $query->whereBetween($minFilter,   [ 'minSalary', 'maxSalary' ])
  ->orWhere(function($query) use ($minFilter,$maxFilter) {
    $query->whereBetween($maxFilter',   [ 'minSalary', 'maxSalary' ]);

  });

这个查询必须如何与上面的查询一起正常工作?

为了清楚起见:已经完成并且可以工作:

$query = User::query();
... //another filters 
        if($request['minSalary'] && $request['maxSalary'])
        {
          $minFilter = (int) $request['minSalary'];
          $maxFilter = (int) $request['maxSalary'];

          $query->whereBetween('minSalary',   [ $minFilter, $maxFilter ])
          ->orWhere(function($query) use ($minFilter,$maxFilter) {
            $query->whereBetween('maxSalary',   [ $minFilter, $maxFilter ]);

          });


//NEED TO IMPLEMENT PSEUDOCODE BELOW TO CODE FROM ABOVE: 
 $query->whereBetween($minFilter,   [ 'minSalary', 'maxSalary' ])
  ->orWhere(function($query) use ($minFilter,$maxFilter) {
    $query->whereBetween($maxFilter',   [ 'minSalary', 'maxSalary' ]);

  });

        }

我的整个代码:

  $query = User::query();
        $query->whereIn('position', $arrOfTags);

    if($request['minAge'] && $request['maxAge']) {
      $maxYear = Carbon::Now()->subYear($request['minAge']);
      $minYear = Carbon::Now()->subYear($request['maxAge']);

      $query->whereBetween('birthdate', [$minYear, $maxYear]);
    }

    if($request['skill']) {
        $query->join('skills', 'cvs.id', '=', 'skills.cv_id')
              ->join('allskills', 'skills.allskills_id', '=', 'allskills.id')
              ->select('cvs.*', 'allskills.name AS skillName')
              ->whereIn('skills.allskills_id', $request['skill']);
    }

if ($request->minSalary && $request->maxSalary) {
    $query->where(function($q) {
        $q->where('minSalary', '>=', request('minSalary'))
          ->where('maxSalary', '<=', request('minSalary'));
    })
    ->orWhere(function($q) {
        $q->where('minSalary', '>=', request('maxSalary'))
          ->where('maxSalary', '<=', request('maxSalary'));
    });
}

$users = $query->distinct()->paginate(3);

最佳答案

SOLUTION

我不知道我是如何找到这个解决方案的,但它非常简单! 我们并不真的需要这么多疯狂的条件,它只需要一些时间来实现正确的数学逻辑。

if(isset($request['minFilter']) && isset($request['maxFilter'])) {
  $minFilter = (int) $request['minFilter'];
  $maxFilter = (int) $request['maxFilter'];

  $query->where(function($query) use ($minFilter,$maxFilter) {
      $query->where('maxSalary', '>' , $minFilter);
      $query->where('minSalary', '<',  $maxFilter);
  });
}

此条件在测试超过 50 个案例时有效。所以,我并没有真正找到一个不会被它覆盖的地方。

关于php - Laravel 在最小-最大过滤器中找到最小-最大工资的一段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48278169/

相关文章:

PHP 使用 session 登录

javascript - 我似乎无法通过 xampp 的 ADMIN 按钮查看 mySQL 数据库

SQL Server简单锁定示例

SQL 在数字字段中搜索非整数

sql - 连接三个表时如何在更少的行中获取所有信息?

php - 如何在服务器端访问 PHP REST API PUT 数据?

PHP 为 sudo 创建 'fake' TTY

php - 按日期选择器范围对表进行排序

PHP从多个选中的复选框和文本输入中插入数组到mySQL

MySQL 性能 - 删除表行或仅将列标记为已删除