为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地将 where 子句添加到 eloquent 查询

有条件地将 where 子句添加到 eloquent 查询

PHP
慕虎7371278 2021-09-18 21:23:13
我有一个产品数据库。我允许用户输入搜索词并显示与其搜索词相关的产品。我想为用户添加使用 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(因为它们都包含“男性”一词)。


查看完整回答
反对 回复 2021-09-18
?
萧十郎

TA贡献1815条经验 获得超13个赞

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

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

已编辑

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

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


查看完整回答
反对 回复 2021-09-18
?
不负相思意

TA贡献1777条经验 获得超10个赞

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


$productsQuery = DB::table('products')

->where('title', 'LIKE', '%'.$searchTerm.'%')

->where(function($query) use ($gender){

     if($gender != ""){

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

      }

})

->get();


查看完整回答
反对 回复 2021-09-18
  • 3 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信