Php Laravel在最小-最大筛选器中查找最小-最大薪资段

Php Laravel在最小-最大筛选器中查找最小-最大薪资段,php,mysql,sql,laravel,Php,Mysql,Sql,Laravel,在DB中,我有一个用户表,它有两列:minSalary和maxSalary 在搜索页面,我有一个工资过滤器。这是一个2点输入类型的范围 <input type="range" name="minSalary" min="0" max="100000" value="3000"> <input type="range" name="maxSalary" min="0" max="100000" value="10000"> 让我们注意一下: minSalary和maxSa

在DB中,我有一个用户表,它有两列:minSalary和maxSalary

在搜索页面,我有一个工资过滤器。这是一个2点输入类型的范围

<input type="range" name="minSalary" min="0" max="100000" value="3000">
<input type="range" name="maxSalary" min="0" max="100000" value="10000">
让我们注意一下:

minSalary和maxSalary是用户表中的列,$minFilter和$maxFilter来自$\u请求

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

现在举几个例子: 过滤器:3000-10000 约翰:3500-5500——这是一场比赛 戴夫:2600-4100是一对,因为maxSalary4100在3000-10000之间 艾琳:7600-11000-是一个匹配<因为minSalary7600在3000-10000之间 安德鲁:2000-11000-不匹配,但必须符合我的逻辑和项目要求

因此,我发现如果我将添加一个附加条件: 如果$minFilter介于minSalary和maxSalary之间,或者$maxFilter介于minSalary和maxSalary之间,则它可以正常工作

它必须看起来像:

  $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);

如果我理解正确,您希望:

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'));
    });
}
我正在扩展@AlexeyMezenin's,也许你在找这个-

$query = $query->where((function ($q) use ($minFilter, $maxFilter) {
        $q->orWhereBetween('minSalary', [$minFilter, $maxFilter]);
        $q->orWhereBetween('maxSalary', [$minFilter, $maxFilter]);
    }))
        ->orWhere((function ($q) use ($minFilter, $maxFilter) {
            $q->orWhere(function ($p) use ($minFilter, $maxFilter) {
                $p->where('minSalary', '>=', $minFilter)
                    ->where('maxSalary', '<=', $minFilter);
            });
            $q->where(function ($p) use ($minFilter, $maxFilter) {
                $p->where('minSalary', '>=', $maxFilter)
                    ->where('maxSalary', '<=', $maxFilter);
            });
        }));
第一个where子句check minSalary必须介于[$minFilter,$MAXPILTER]之间,或者MAXPALARY必须介于[$minFilter,$MAXPILTER]之间

第二个where子句check$minFilter必须介于['minSalary','maxSalary']之间,或者$maxFilter必须介于['minSalary','maxSalary']之间

And query使用where子句表示And查询。

试试这个

$query->where(function($q) use($minSalary, $maxSalary){
           $q->where('min_salary', '>=', $minSalary)
           ->orWhere('max_salary', '>=', $minSalary);
    }
    ->where('min_salary', '<=', $maxSalary)
    ->get()
它满足这四个约束 1.约翰:3500-5500-这是一场比赛,因为minSalary3500更大$minSalary3000和minSalary3500<$maxSalary10000

戴夫:2600-4100-是一个匹配,因为maxSalary4100更大$minSalary3000和minSalary2600<$maxSalary10000

艾琳:7600-11000-是一个匹配项<因为minSalary7600大于$minSalary3000和minSalary7600<$maxSalary10000

安德鲁:2000-11000——这是一场比赛,因为maxSalary11000更大$minSalary3000和minSalary2000<$maxSalary10000

它将限制其他无效范围

解决方案

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

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多个测试案例。所以,我真的没有发现每个人都不在其中。

试试这个

$query->whereBetween'minSalary',[$minFilter,$maxFilter]>或者whereBetween'maxSalary',[$minFilter,$maxFilter],但是安德鲁的工资不匹配,因为他的最低和最高工资不在3000-10000之间,那你为什么说它必须匹配呢?我已经有这个疑问了。您的查询将无法正常工作,因为orWhereBetween位于函数之外。@AlexeyMezenin是的,现在它不匹配,但从逻辑角度来看它必须匹配,为了实现它,我需要像以前一样使用一个查询:$query->whereBetween'minFilter',['minSalary',maxSalary']->orWherefunction$query使用$minFilter,$maxFilter{$query->whereBetween$maxFilter,['minSalary','maxSalary'];};使用@AlexeyMezenin的代码,它似乎满足了你的要求不,先生。没有。它甚至没有返回任何结果。请让我再解释一遍。我需要一起检查:4个条件1.“'minSalary'必须介于[$minFilter,$maxFilter]之间,或者'maxSalary'必须介于[$minFilter,$maxFilter]2之间$minFilter必须介于['minSalary'、'maxSalary']或$maxFilter必须介于['minSalary'、'maxSalary']3之间。1和2必须与和连接operator@priMo-我认为逻辑是正确的,但问题出在其他地方。你修改我的代码了吗?什么是$request?你是注入Request$Request对象,还是像$Request=Request->all这样做?@priMo-ex3m还有,我想你不明白你到底想要实现什么。因为如果按照你描述的逻辑,Andrew不应该匹配结果。因为他的minSalary或maxSalary不在过滤器之间。如果您想获得与筛选器薪资范围相同的用户,请使用我的代码。您可以查看我上次对问题的编辑或开始聊天吗?@priMo-ex3m whereBetween在此不起作用。同样,你不明白你需要什么样的逻辑,因为如果你按照你描述的逻辑去做,安德鲁就不会有结果。对不起,我帮不了你,因为你没有回答我以前问过的问题。另外,我真的认为我的逻辑会对你有用,当你明白它是如何工作的时候。看起来正是我所期望的。我会让你知道结果的,谢谢。Idk没有显示任何错误,但是当我运行过滤器时,它会返回0个值,这意味着smth对代码不合适。我真的不知道在这个查询中到底在哪里查找错误
不是关于错误,而是关于逻辑。你想要完成的并不是你试图从逻辑上解释我们的东西。我正在更新我的答案。现在试试。编辑后,它仍然返回与主查询相同的结果,没有附加条件。Fhuh,这不是一个描述如何解决这种过滤器的开源代码吗?请一步一步地重新检查您的数据,在一次查询之后,然后在另一次查询之后,您希望得到什么数据。查询很好,只是缺少正确的逻辑。将您的数据与逻辑相匹配,并用纯文本和适当的数据逐一用逻辑更新问题。
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);
  });
}
$query->where(function($query) use($minSalary=0, $maxSalary=0){
if($minSalary){
$query->where('min_salary', '>=', $minSalary);
}
if($maxSalary){
$query->where('max_salary', '<=', $maxSalary);
}
})->get();