Laravel选择带数组的查询

时间:2014-12-04 16:18:09

标签: php laravel laravel-4 eloquent

我得到一个像这样的字符串

$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次。我的错误在哪里?

2 个答案:

答案 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 Ontario123 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;
    }