![](/img/trans.png)
[英]How to add a where clause when using “with” on an Eloquent query in Laravel
[英]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.