Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在Laravel/PHP中找到另一种查询搜索结果的方法吗_Php_Laravel - Fatal编程技术网

需要在Laravel/PHP中找到另一种查询搜索结果的方法吗

需要在Laravel/PHP中找到另一种查询搜索结果的方法吗,php,laravel,Php,Laravel,我真的很难找到在我的网站上进行搜索查询的另一种方法。目前,我已经搜索了“最小尺寸、最大尺寸、城市、街道、最小价格、最大价格”的临界值 所以我有这些查询(使用Laravel标准构建): if(!empty($by)&&empty($adrese)&&empty($minstor)&&empty($maxstor)) { $users=User::where('pris','',$minpris)->where('by','=',$by)->orderBy('created_at','DESC')-

我真的很难找到在我的网站上进行搜索查询的另一种方法。目前,我已经搜索了“最小尺寸、最大尺寸、城市、街道、最小价格、最大价格”的临界值

所以我有这些查询(使用Laravel标准构建):

if(!empty($by)&&empty($adrese)&&empty($minstor)&&empty($maxstor))
{
$users=User::where('pris','',$minpris)->where('by','=',$by)->orderBy('created_at','DESC')->get();
}
其他(!empty($by)&&!empty($adrese)&&empty($minstor)&&empty($maxstor))
{
$users=User::where('pris','',$minpris)->where('by','=',$by)->where('ADRESE','=',$ADRESE)->orderBy('created_at','DESC')->get();
}
elseif(empty($by)&&!empty($adrese)empty($minstor)&&empty($maxstor))
{
$users=User::where('pris','',$minpris)->where('adrese','=',$adrese)->orderBy('created_at','DESC')->get();
}
其他的
{
$users=User::where('pris','',$minpris)->orderBy('created_at','DESC')->get();
}
所有这些都只是为了让用户能够搜索上面的临界值,但是如果我想再添加几个临界值,我可以想象我需要运行多少不同的
if函数才能获得所有特定的输入等。这会让我迅速响应


我如何避免这个问题,而不必创建数百个不同的
if-else
语句来返回正确的查询?

您可以这样做

    $q = User::query();

    if (\Input::has('name')) {
        $q->where('name', \Input::get('name')); 
    }
    if (\Input::has('address')) {
        $q->where('address', \Input::get('address')); 
    }

    ...
你可以像这样在循环中迭代它

  foreach($request->all() as $req_field => $req_data) {
      if (\Input::has($req_field)) {
        $q->where($req_field, \Input::get($req_field)); 
    }
  }
p、 或者你可以在范围内迭代它

然后


你可以这样做

    $q = User::query();

    if (\Input::has('name')) {
        $q->where('name', \Input::get('name')); 
    }
    if (\Input::has('address')) {
        $q->where('address', \Input::get('address')); 
    }

    ...
你可以像这样在循环中迭代它

  foreach($request->all() as $req_field => $req_data) {
      if (\Input::has($req_field)) {
        $q->where($req_field, \Input::get($req_field)); 
    }
  }
p、 或者你可以在范围内迭代它

然后


您可以使用相应的运算符设置过滤器数组。然后迭代已通过的过滤器并运行它们(这尚未经过测试,但应该会让您朝着正确的方向前进):

$available\u查询=[
['input'=>'maxpris','operator'=>'','field'=>'pris'],
['input'=>'by','operator'=>'by','field'=>'by'],
[“输入”=>“地址”,“运算符”=>“=”,“字段”=>“地址”],
]
$query=User::orderBy('created_at','DESC');
foreach($available\u查询作为$filter){
if(request()->input($filter['input'])){
$query=$query->where(
$filter['field'],
$filter['operator'],
request()->input($filter['input']))
);
}
}
$users=$query->get();

编辑:我在原始脚本中发现一个错误。已更新以修复错误并使其更具可读性。

您可以使用相应的运算符设置筛选器数组。然后迭代传递的筛选器并运行它们(这尚未测试,但应能使您朝正确的方向前进):

$available\u查询=[
['input'=>'maxpris','operator'=>'','field'=>'pris'],
['input'=>'by','operator'=>'by','field'=>'by'],
[“输入”=>“地址”,“运算符”=>“=”,“字段”=>“地址”],
]
$query=User::orderBy('created_at','DESC');
foreach($available\u查询作为$filter){
if(request()->input($filter['input'])){
$query=$query->where(
$filter['field'],
$filter['operator'],
request()->input($filter['input']))
);
}
}
$users=$query->get();

编辑:我在我的原始脚本中发现了一个错误。更新以修复错误并使其更具可读性。

由于OP特别要求没有一堆
if
语句,我认为您应该展示一个建议循环迭代的示例。嗨,Yurich,谢谢您的回答。但是如果输入既有名称又有地址,该怎么办ss,但不是最小值,而是最大值?如果不编写大量相同的代码,只需很少的更改,我如何构建它?再次您好Yurich,感谢您的更新,我看到了这个想法-但是我如何检查值是否小于、大于或等于?例如,对于最小值和最大值,我想让用户介于两者之间e最小值和最大值价格?@Patrick,你需要为最大值和最小值以及名称和地址等输入设置不同的条件。在一个循环中设置不同的条件太难了。@Patrick你可以设置所有的条件。例如,在->Wherebeth('votes',[1100])既然OP特别要求不要有一堆
if
语句,我想你应该展示一个循环迭代的例子。嗨,Yurich,谢谢你的回答。但是如果输入既有名称和地址,又没有最小值,但有最大值呢?我怎么能在没有大量编写t的情况下构建它呢他使用了相同的代码,但改动很少?你好,尤里奇,再次感谢你的更新,我明白了这个想法-但是我该如何检查值是否小于、大于或等于?例如,对于最小价格和最大价格,我想让用户介于最小价格和最大价格之间?@Patrick,你需要为最大价格和最小价格设置不同的条件名称和地址等输入。在一个循环中放入不同的条件太难了。@Patrick您可以生成所有条件。例如between->whereBetween('vots',[1100])嗨,帕特里克,开箱即用!棒极了,谢谢你的支持!:)同样,你需要将输入放入数组。分组输入是更好的方式。嗨,帕特里克,开箱即用!棒极了,谢谢你的支持!:)同样,你需要将输入放入数组。分组输入是更好的方式。
$available_queries = [
    ['input' => 'maxpris', 'operator' => '<', 'field' => 'pris'],
    ['input' => 'minpris', 'operator' => '>', 'field' => 'pris'],
    ['input' => 'by',      'operator' => '=', 'field' => 'by'],
    ['input' => 'adresse', 'operator' => '=', 'field' => 'addresse'],
]

$query = User::orderBy('created_at', 'DESC');

foreach($available_queries as $filter){
    if(request()->input($filter['input'])){
        $query = $query->where(
            $filter['field'],
            $filter['operator'],
            request()->input($filter['input'])
        );
    }
}

$users = $query->get();