我有一个产品数据库。我允许用户输入搜索词并显示与其搜索词相关的产品。我想为用户添加使用 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 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
您的想法和方法是正确的,但您正在混合LIKE和=查询。%是通配符,但只能与LIKE.
所以,如果你想使用通配符 and LIKE,
if(!empty($gender)) {
$productsQuery->where('gender', 'LIKE', "%$gender%");
}
或者,如果您想按精确文本进行匹配,
if(!empty($gender)) {
$productsQuery->where('gender', $gender);
}
例如,您当前的代码将搜索文字 string 的精确匹配%male%。
请记住,通过使用通配符,male也将匹配female(因为它们都包含“男性”一词)。
萧十郎
TA贡献1815条经验 获得超13个赞
您还应该在第二个 where 子句中使用 LIKE:
$productsQuery->where('gender', 'LIKE', "%{$gender%}");
已编辑
如果您需要搜索确切的性别,则根本不能使用通配符。
$productsQuery->where('gender', '=', $gender);
不负相思意
TA贡献1777条经验 获得超10个赞
实际上,您可以在一个查询中完成此操作。就像这样:
$productsQuery = DB::table('products')
->where('title', 'LIKE', '%'.$searchTerm.'%')
->where(function($query) use ($gender){
if($gender != ""){
$query->where('gender', '=', $gender);
}
})
->get();
- 3 回答
- 0 关注
- 174 浏览
添加回答
举报
0/150
提交
取消