Laravel:通过表格中的最小值和最大值进行搜索

时间:2018-07-16 10:43:33

标签: laravel laravel-5.5

我对使用min-max值进行搜索感到困惑。在我的posts表中有两个字段min_pricemax_price,在搜索中有两件事我需要在搜索查询中进行介绍。

  1. 如果用户仅搜索max_value,则会显示所有价格为less than or equal to max_value的帖子。

  2. 如果用户仅搜索min_value,则会显示所有价格为less than or equal to min_value的帖子。

  3. 如果用户使用min_valuemax_value搜索,它将显示价格在min_value and max_value之间的所有帖子。

  4. 如果都为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();

我该怎么办

3 个答案:

答案 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_pricemax_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();

参考:https://laravel.com/docs/5.6/queries

答案 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可能会失败,但是这是这样做的方法。