使用多种不同查询的高级搜索查询


Advanced search query using multiple, and varied queries

目前,用户可以添加一个条件,在我们的数据库中搜索该条件以找到任何匹配的结果。这是完美的工作,然而,现在有必要"加强"搜索。为了让事情变得更清楚,下面有一个工作示例:

场景

用户想要buy一个属性:

  1. 在某个location
  2. 哪个有4卧室
  3. detached
  4. 在30万至50万美元的价格范围内

这会被添加到数据库中,然后下面的函数会找到任何匹配的属性(缩写):

$locations = Location::whereHas('coordinate', function ($q) use 
                               ($bedrooms, $property_type)
            {
                $q->where('bedrooms', '=', $bedrooms)
                ->where('type', '=', $property_type);
            })->lists('id');

因此,正如您所看到的,该查询非常"设置"在仅查询one卧室数量和one属性类型上——它只是同一行上的一个变量!

现在,问题来了

目前,用户可以添加卧室、type of house等的一个偏好。更改为添加卧室的multiple choicetype of house等。因此,新的query将适用于用户:

建议方案

  1. 在某个location内(这始终是一个位置)
  2. 哪个有3,4,5,6间卧室
  3. detached, studio, semi-detached, bungalow
  4. 在30万至50万美元的价格范围内。(总是一个范围)

我的问题主要是建议,如何存储这样的查询,然后将其查询回来以返回符合其条件的任何属性。每个标准目前都存在于一排,但我想我必须有一张单独的桌子来存储卧室的数量等。。。?

此外,例如,如果一个用户只想要1卧室和detached, studio, semi-detached, bungalow,而另一个用户的标准可能更深入,那么查询如何适应这一点?

我不是完全重新设计我的表,而是可以不序列化卧室数量等。然后将其存放在VARCHAR中,以及根据请求取消它们的序列化?

我希望我已经解释清楚了,包括提供我当前的代码。如果你需要进一步的信息,请告诉我。非常感谢。

您可以使用逻辑来控制where子句,具体取决于设置的值和/或它们是否是数组。而不是链接你可以写的where语句:

//bedrooms (required, mixed)
if(is_array($bedrooms)){
    $q->whereIn('bedrooms', $bedrooms)
}else{
    $q->where('bedrooms', '=', $bedrooms)
}
//type (required, mixed)
if(is_array($property_type)){
    $q->whereIn('type', $property_type)
}else{
    $q->where('type', '=', $property_type)
}
//minimum price (optional, int)
if(isset($min_price)){
    $q->where('price', '>=' , $min_price)
}
//maximum price (optional, int)
if(isset($max_price)){
    $q->where('price', '<=' , $max_price)
}

这只是一个基于您所提供内容的快速示例,但我可能会看到如何重构调用或传递给查询的值,以提高代码的可读性。