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

时间:2014-10-15 16:40:41

标签: php mysql sql laravel laravel-4

目前,用户可以添加在我们的数据库中搜索的条件以查找任何匹配的结果。这是完美的,但是,现在需要“增强”搜索。为了让事情更清楚,下面有一个工作示例:

方案

用户希望buy属性:

  1. 在某个location
  2. 其中有4间卧室
  3. detached
  4. 在$ 300k - $ 500k的价格范围内。
  5. 将其添加到数据库中,然后下面的函数找到任何匹配的属性(缩短):

    $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等...所以新{{} 1}}将是一个用户:

    建议的方案

    1. 在某个query内(这始终是一个位置)
    2. 其中有location间卧室
    3. 3,4,5,6
    4. 在$ 300k - $ 500k的价格范围内。 (总是一个范围)。
    5. 我的问题主要是建议,如何存储这样的查询,然后再查询它以返回符合其条件的任何属性。每个标准目前都存在于一行,但我想我必须有一个单独的表来存储卧室的数量等...?

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

        

      不是完全重新设计我的表,我不能序列化   卧室的数量等..然后将它们存储在VARCHAR,和   根据要求取消序列化?

      我希望我已经清楚地解释了一些事情,包括提供我当前的代码。如果您需要更多信息,请告诉我。非常感谢提前。

1 个答案:

答案 0 :(得分:0)

您可以使用逻辑来控制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)
}

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