【问题标题】:Laravel select query with arrayLaravel 带数组的选择查询
【发布时间】:2014-12-04 16:18:08
【问题描述】:

我得到一个这样的字符串

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

【问题讨论】:

  • 第一次尝试爆炸会发生什么?
  • 一样,没有结果@AnandPatel
  • 但是您的标题与确切的值不匹配,例如 is,等等,这就是您需要使用 where('heading', 'LIKE', '%value%')->get() 的原因像这样,不完全是

标签: php laravel laravel-4 eloquent


【解决方案1】:

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 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,谢谢,但是(通过我刚刚做的小测试),我搜索的两个词似乎都需要在字符串中。是否有可能找到任何列中出现的所有字符串?你怎么看?
  • 嗯...不应该是这样的。让我快速编辑一下以显示一个示例。
  • 是的,我认为 concat 也会找到所有内容。
  • 例如,如果我只搜索“What”,我会得到 6 个结果,但如果我搜索“What RBC”,我只会得到 3 个结果,尽管我也期望至少有 6 个。
  • 好吧,查询将被构造为WHERE ... AND WHERE ...,因为这就是 Laravel 所做的。要执行OR WHERE,您需要在foreach 中设置一个计数器,在第一个结果之后,将$query->where(...) 更改为$query->orWhere(...)
【解决方案2】:
 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2023-03-12
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多