【问题标题】:Multiple whereIn clauses don't return expected results多个 whereIn 子句不返回预期结果
【发布时间】:2021-03-21 07:24:19
【问题描述】:

我需要根据搜索词过滤产品,所以我的控制器中有这个:

$activeFilters = Array(
    "Display dimensions" => Array("5' inches","5.5' inches"),
    "Color" => Array("Grey","Black")
);

$product = Product->whereHas("attributes", function($query) use ($activeFilters){
    foreach($activeFilters as $group){
        $query = $query->whereIn("product_features.text", $group);
    }
})->get();

现在,如果我在活动过滤器数组中仅设置一组(例如显示尺寸)及其值,则查询将返回预期结果。当我附加第二组时,如代码中所示,结果为空,即使产品表中存在与这些过滤器匹配的产品。

【问题讨论】:

  • 你在做 AND 哪里。我猜你需要一个 OR。
  • 我尝试在 whereIn 子句中添加“或”,但结果是我得到了所有产品,所以很遗憾不是这样。
  • 你可以使用orWhereIn而不是whereIn

标签: php mysql laravel laravel-query-builder


【解决方案1】:

尝试使用 orWhereIn 进行逻辑或的参数分组

$product = Product::whereHas("attributes", function($query) use ($activeFilters){
  $query->where(function($query) use ($activeFilters) {
    foreach($activeFilters as $group){
        $query->orWhereIn("product_features.text", $group);
    }
  });
})->get();

【讨论】:

    【解决方案2】:

    我找到了解决方案。使用 orWhere(如您的回答中所建议),我获得的结果包含以下所有产品:

    • 显示器尺寸:5' 英寸和 5.5' 英寸

    • 颜色:灰色、黑色

    为了获得预期的结果,我使用了多个 whereHas,如下面的代码所示:

    $activeFilters = Array(
        "Display dimensions" => Array("5' inches","5.5' inches"),
        "Color" => Array("Grey","Black")
    );
    
    $firstFilter = array_shift($activeFilters);
    
    $product = Product::whereHas("attributes", function($query) use ($firstFilter){
        return $query->whereIn("product_features.text", $firstFilter);
    }
    
    foreach($activeFilters as $group){
        $product = $product->whereHas("attributes", function($query) use ($group){
            return $query->whereIn("product_features.text", $group);
        }
    })
    
    $product = $product->get();
    

    通过这种方式,我得到的产品显示为 5 英寸或 5.5 英寸,并且是灰色或黑色

    【讨论】:

    • 每次调用whereHas 时都会添加一个子查询。这是不可扩展的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2011-08-31
    • 2021-09-29
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多