我对使用min-max
值进行搜索感到困惑。在我的posts
表中有两个字段min_price
和max_price
,在搜索中有两件事我需要在搜索查询中进行介绍。
如果用户仅搜索max_value
,则会显示所有价格为less than or equal to max_value
的帖子。
如果用户仅搜索min_value
,则会显示所有价格为less than or equal to min_value
的帖子。
如果用户使用min_value
和max_value
搜索,它将显示价格在min_value and max_value
之间的所有帖子。
如果都为null,请返回所有帖子。
我该怎么做?
我的代码:
$searchablePost = Post::with(['product','postattribute.attribute.category','user.userDetails'])
->whereIn('product_id', $userApprovalProductIDs)
->whereIn('demand_or_supply', $demand_or_supply);
// skip my search query code
$searchedPost = $searchablePost->offset($offset)->limit($limit)->orderBy('id','desc')->get();
我该怎么办
答案 0 :(得分:5)
检查:
1。(如果两个值(最小值和最大值)都可用(即不为null):
2。(如果有最小值):
3。(如果有最大值):
// if none of them is null
if (! (is_null($min_value) && is_null($max_value))) {
// fetch all between min & max values
$searchablePost = $searchablePost->whereBetween('price', [$min_value, $max_value]);
}
// if just min_value is available (is not null)
elseif (! is_null($min_value)) {
// fetch all greater than or equal to min_value
$searchablePost = $searchablePost->where('price', '>=', $min_value);
}
// if just max_value is available (is not null)
elseif (! is_null($max_value)) {
// fetch all lesser than or equal to max_value
$searchablePost = $searchablePost->where('price', '<=', $max_value);
}
如果您有min_price
和max_price
的单独字段(如注释中所述),只需更改代码如下:
if (! (is_null($min_value) && is_null($max_value))) {
$searchablePost = $searchablePost
->where('min_price', '>=', $min_value)
->where('max_price', '<=', $max_value);
}
elseif (! is_null($min_value)) {
$searchablePost = $searchablePost->where('min_price', '>=', $min_value);
}
elseif (! is_null($max_value)) {
$searchablePost = $searchablePost->where('max_price', '<=', $max_value);
}
答案 1 :(得分:1)
您可以设置$ min = 0;和$ max = infinite_choosen_number;并将whereBetween方法附加到查询中,如下面的代码:
$searchablePost = Post::with(['product','postattribute.attribute.category','user.userDetails'])
->whereIn('product_id', $userApprovalProductIDs)
->whereIn('demand_or_supply', $demand_or_supply)
->whereBetween('price', ["$min", "$max"])->get();
答案 2 :(得分:0)
您不能使用whereIn来执行此操作,而可以使用where语句来执行此操作。 像这样
`
$searchablePost = Post::with(['product','postattribute.attribute.category','user.userDetails'])
->whereIn('product_id', $userApprovalProductIDs)
->whereIn('demand_or_supply', $demand_or_supply)
->where('price', '>=', $minPrice)
`
没有尝试过,所以int可能会失败,但是这是这样做的方法。