有条件地将 where 子句添加到 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(); 

当这个方法被调用时。我收到一个空集合。



慕虎7371278
浏览 180回答 3
3回答

白猪掌柜的

您的想法和方法是正确的,但您正在混合LIKE和=查询。%是通配符,但只能与LIKE.所以,如果你想使用通配符 and LIKE,if(!empty($gender)) {    $productsQuery->where('gender', 'LIKE', "%$gender%");}或者,如果您想按精确文本进行匹配,if(!empty($gender)) {    $productsQuery->where('gender', $gender);}例如,您当前的代码将搜索文字 string 的精确匹配%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();
打开App,查看更多内容
随时随地看视频慕课网APP