我得到一个像这样的字符串
$str = 'What is a typical day like';
现在我想在数据库中搜索此字符串包含的每个单词。
What
is
a
...
我正在尝试以下方法:
$var = Input::get('search');
// first try was $data = explode(' ',$var);
$data = array(str_replace(' ',',',$var));
$result = Faq::whereIn('heading', $data)->orWhereIn('wording',$data)->get();
return Response::json(array('name' => $result));
两者都没有给我任何结果,但每个单词在数据库中至少是4次。我的错误在哪里?
答案 0 :(得分:2)
explode()
是在这里使用的正确功能,因为它会将您的所有单词正确地分成数组。这只有在您(例如)寻找像#34; 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
在所有列上创建一个包含所有colmuns的所有值的巨大字符串,然后查询该字符串以匹配$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++;
}
答案 1 :(得分:0)
public static function getProductSearch($words){
$word = explode(' ', $words);
$value = Product::where('active', 'Y');
foreach ($word as $key) {
$value->where('title', 'like', "%$key%");
}
$data = $value->get();
return $data;
}