有条件地将 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 查询的主要内容,如果未能解决你的问题,请参考以下文章