explode() 是在这里使用的正确函数,因为它会正确地将所有单词拆分为一个数组。如果您正在寻找(例如)像“Mary Ann”这样的名字或其中有空格的名字,这将不起作用。至于查询,如果您尝试在每一列中搜索每个单词,这可能有点棘手……但您可以这样做:
$query = Faq->select(); // Initializes the query
foreach($data AS $value){
$query->where(DB::raw("CONCAT_WS(' ', column_1, column_2, ...)"), 'LIKE', '%'.$value.'%');
}
$faqs = $query->get(); // Runs the query
其背后的逻辑是 CONCAT_WS 在所有列上创建一个包含所有 colmun 的所有值的巨大字符串,然后查询该字符串以匹配 $data 数组中的每个单词。
当您知道要查找的列时,这种查询(即根据输入搜索/过滤结果)会容易得多。 column_name => value_to_find 的关联数组使您可以更轻松地做到这一点:
foreach($data AS $key => $value){
$query->where($key, 'LIKE', '%'.$value.'%');
}
$faqs = $query->get();
编辑示例
+----------+----------+----------+
| address | city | province |
+----------+----------+----------+
| 123 Main | Toronto | Ontario |
| 123 2nd | Montreal | Quebec |
+----------+----------+----------+
鉴于此测试数据,在您的 SQL 中调用 CONCAT_WS(" ", address, city, province)) 将产生 123 Main Toronto Ontario 和 123 2nd Montreal Quebec 的字符串。如果您的搜索数组类似于[0] => 123, [1] => Toronto, [2] => Ontario,我认为您会(也许?)得到1 个结果,因为$query->where(...) 后跟另一个$query->where(...) 会产生WHERE ... AND WHERE ... 结构。正如我在编辑中提到的,在 foreach 中添加一个计数器:
$counter = 0;
$query = Faq->select(); // Initializes the query
foreach($data AS $value){
if($counter == 0){
$query->where(DB::raw("CONCAT_WS(' ', column_1, column_2, ...)"), 'LIKE', '%'.$value.'%');
} else {
$query->orWhere(DB::raw("CONCAT_WS(' ', column_1, column_2, ...)"), 'LIKE', '%'.$value.'%');
}
$counter++;
}