有条件地将where子句添加到雄辩的查询中

时间:2019-07-02 08:59:41

标签: php ajax laravel eloquent

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

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

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

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

$productsQuery->get(); 

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

3 个答案:

答案 0 :(得分:3)

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

因此,如果您想使用通配符和LIKE

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

或者,如果您想按完全匹配的文字进行匹配,

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

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

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

答案 1 :(得分:2)

您还应该在第二个where子句中使用LIKE:

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

已编辑

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

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

答案 2 :(得分:2)

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

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