目前,用户可以添加一个条件,在我们的数据库中搜索该条件以找到任何匹配的结果。这是完美的工作,然而,现在有必要"加强"搜索。为了让事情变得更清楚,下面有一个工作示例:
场景
用户想要buy
一个属性:
- 在某个
location
内 - 哪个有
4
卧室 - 是
detached
- 在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 choice
、type of house
等。因此,新的query
将适用于用户:
建议方案
- 在某个
location
内(这始终是一个位置) - 哪个有
3,4,5,6
间卧室 - 是
detached, studio, semi-detached, bungalow
- 在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)
}
这只是一个基于您所提供内容的快速示例,但我可能会看到如何重构调用或传递给查询的值,以提高代码的可读性。