繁体   English   中英

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

[英]Conditionally add where clause to eloquent query

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

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

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

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

$productsQuery->get(); 

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

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

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

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

或者,如果您想按确切的文字进行匹配,

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

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

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

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

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

已编辑

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM