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

Posted

技术标签:

【中文标题】有条件地将 where 子句添加到 eloquent 查询【英文标题】:Conditionally add where clause to eloquent query 【发布时间】:2019-11-12 21:18:17 【问题描述】:

我有一个产品数据库。我允许用户输入搜索词并显示与他们的搜索词相关的产品。我想为用户添加使用 AJAX 通过“性别”进一步过滤这些结果的能力。如果用户从选择框中选择性别,则会将其发送到 URL 查询字符串。

这是我负责检测“性别”是否在查询字符串中的代码。

$searchTerm = request('s');
$gender = request('gender');

$productsQuery = DB::table('products')
                ->where('title', 'LIKE', "%$searchTerm%");
if ($gender != "") 
    $productsQuery->where('gender', '=', "%$gender%");


$productsQuery->get(); 

何时调用此方法。我收到一个空集合。

【问题讨论】:

【参考方案1】:

您的想法和方法是正确的,但是您正在混合 LIKE= 查询。 % 是通配符,但只能与 LIKE 一起使用。

所以,如果你想使用通配符和LIKE

if(!empty($gender)) 
    $productsQuery->where('gender', 'LIKE', "%$gender%");

或者如果你想通过精确的文本进行匹配,

if(!empty($gender)) 
    $productsQuery->where('gender', $gender);

例如,您当前的代码将搜索文字字符串 %male% 的完全匹配。

请记住,通过使用通配符,male 也将匹配 female(因为它们都包含“男性”一词)。

【讨论】:

【参考方案2】:

你也应该在第二个 where 子句中使用 LIKE:

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

已编辑

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

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

【讨论】:

但是如果值为“男性”,它将同时匹配男性和女性。鉴于 OP 使用了=,我认为它不应该是通配符。 这取决于您要搜索的内容。如果您需要搜索您不使用通配符的确切单词。如果您需要搜索以某些字符开头的单词,您只需使用 1 个通配符(第二个)。 @Tolios 他也可以删除百分比并选择= 正确,但是您可以删除第二个参数。这也不是这个答案所暗示的,我发现很难相信类似操作是这里的最终目标【参考方案3】:

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

$productsQuery = DB::table('products')
->where('title', 'LIKE', '%'.$searchTerm.'%')
->where(function($query) use ($gender)
     if($gender != "")
        $query->where('gender', '=', $gender);
      
)
->get();

【讨论】:

以上是关于有条件地将 where 子句添加到 eloquent 查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4:将 where 子句添加到连接条件

减去/添加到 Where 子句时间戳条件

在 from 子句 *and* where 子句中添加连接条件使查询更快。为啥?

如何使用 AREL 执行条件 where 子句

在WHERE子句中添加第二个条件?

向 where 子句添加条件