我有一个产品数据库。我允许用户输入搜索词,并显示与他们的搜索词相关的产品。我想为用户增加使用AJAX通过“性别”进一步过滤这些结果的功能。如果用户从选择框中选择性别,则将其发送到URL查询字符串。
这是我的代码,负责检测查询字符串中是否包含“性别”。
$searchTerm = request('s');
$gender = request('gender');
$productsQuery = DB::table('products')
->where('title', 'LIKE', "%$searchTerm%");
if ($gender != "") {
$productsQuery->where('gender', '=', "%$gender%");
}
$productsQuery->get();
调用此方法时。我收到一个空集合。
答案 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();