过去几天我在这方面花了很多时间,这是我的解决方案。它与其他类似但不同,因此有一天它可能对某人有价值:
我有一个发出 GET 请求的 Vue 组件,所以 $request->get('searchTerms') 来自 HTML 表单提交中的 <input name="searchTerms">。
我想让用户控制要搜索的字段,这就是为什么 $search_terms 是要搜索的列数组。
我想要它,所以如果用户搜索“McDonalds 604”,它将过滤记录列表并为该搜索显示两个不同的匹配项。一个与business_name 匹配的“麦当劳”和一个与phone_number 的区号匹配的“604”。这将确保用户在只知道一些片段的情况下获得所有相关信息。
目标是迭代搜索词,并使用通用公式迭代搜索字段(列),该公式可应用于任意数量的搜索词和列,在运行时动态.
$search_fields = ['project_name', 'business_name', 'phone_number'];
$search_terms = explode(' ', $request->get('searchTerms'));
$query = Campaign::query();
foreach ($search_terms as $term) {
$query->orWhere(function ($query) use ($search_fields, $term) {
foreach ($search_fields as $field) {
$query->orWhere($field, 'LIKE', '%' . $term . '%');
}
});
}
$filtered = $query->get();
我建议阅读 Laravel 的查询文档,因为它会让您对这项任务有更好的直觉:https://laravel.com/docs/5.6/queries
在上面的代码中,我们使用parameter grouping,如果你使用where与orWhere相比,它会改变算法的特性。
奖金事实
我还强烈建议您使用$query->toSql() 和$query->getBindings() 测试您的SQL 语句。您可以将它们放在$query->get() 的位置,以查看它生成的 SQL 语句是什么样的以及参数绑定是什么。 getBindings() 将显示? 在toSql() 中的值。