【问题标题】:Conditionally add where clause to eloquent query有条件地将 where 子句添加到 eloquent 查询
【发布时间】:2019-11-12 21:18:17
【问题描述】:

我有一个产品数据库。我允许用户输入搜索词并显示与他们的搜索词相关的产品。我想为用户添加使用 AJAX 通过“性别”进一步过滤这些结果的能力。如果用户从选择框中选择性别,则会将其发送到 URL 查询字符串。

这是我负责检测“性别”是否在查询字符串中的代码。

$searchTerm = request('s');
$gender = request('gender');

$productsQuery = DB::table('products')
                ->where('title', 'LIKE', "%$searchTerm%");
if ($gender != "") {
    $productsQuery->where('gender', '=', "%$gender%");
}

$productsQuery->get(); 

何时调用此方法。我收到一个空集合。

【问题讨论】:

    标签: php ajax laravel eloquent


    【解决方案1】:

    您的想法和方法是正确的,但是您正在混合 LIKE= 查询。 % 是通配符,但只能与 LIKE 一起使用。

    所以,如果你想使用通配符和LIKE

    if(!empty($gender)) {
        $productsQuery->where('gender', 'LIKE', "%$gender%");
    }
    

    或者如果你想通过精确的文本进行匹配,

    if(!empty($gender)) {
        $productsQuery->where('gender', $gender);
    }
    

    例如,您当前的代码将搜索文字字符串 %male% 的完全匹配。

    请记住,通过使用通配符,male 也将匹配 female(因为它们都包含“男性”一词)。

    【讨论】:

      【解决方案2】:

      你也应该在第二个 where 子句中使用 LIKE:

      $productsQuery->where('gender', 'LIKE', "%{$gender%}");
      

      已编辑

      如果您需要搜索确切的性别,则根本不能使用通配符。

      $productsQuery->where('gender', '=', $gender);
      

      【讨论】:

      • 但是如果值为“男性”,它将同时匹配男性和女性。鉴于 OP 使用了=,我认为它不应该是通配符。
      • 这取决于您要搜索的内容。如果您需要搜索您不使用通配符的确切单词。如果您需要搜索以某些字符开头的单词,您只需使用 1 个通配符(第二个)。
      • @Tolios 他也可以删除百分比并选择=
      • 正确,但是您可以删除第二个参数。这也不是这个答案所暗示的,我发现很难相信类似操作是这里的最终目标
      【解决方案3】:

      实际上,您可以在一个查询中完成此操作。就这样:

      $productsQuery = DB::table('products')
      ->where('title', 'LIKE', '%'.$searchTerm.'%')
      ->where(function($query) use ($gender){
           if($gender != ""){
              $query->where('gender', '=', $gender);
            }
      })
      ->get();
      

      【讨论】:

        猜你喜欢
        • 2015-01-29
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多