【问题标题】:Creating search functionality with Laravel 4使用 Laravel 4 创建搜索功能
【发布时间】:2013-10-26 21:39:13
【问题描述】:

我正在尝试为用户创建一种搜索网站上所有产品的方法。当他们搜索“burton 滑雪板”时,我只希望带有 burton 品牌的滑雪板出现在结果中。但如果他们只搜索“burton”,那么所有带有 burton 品牌的产品都应该出现。

这是我试图写的,但由于多种原因无法正常工作。

控制器:

 public function search(){
    $input = Input::all();

    $v= Validator::make($input, Product::$rules);

    if($v->passes())
    {

        $searchTerms = explode(' ', $input);
        $searchTermBits = array();
        foreach ($searchTerms as $term) {
            $term = trim($term);
            if (!empty($term)){
                $searchTermBits[] = "search LIKE '%$term%'";
            }
        }
        $result = DB::table('products')
        ->select('*')
        ->whereRaw(". implode(' AND ', $searchTermBits) . ")
        ->get();

        return View::make('layouts/search', compact('result')); 
    }
    return Redirect::route('/');    
}

我正在尝试重新创建为此stackoverflow.com problem 给出的第一个解决方案

我发现的第一个问题是我试图分解$input,但它已经是一个数组。所以我不确定如何解决这个问题。我写->whereRaw(". implode(' AND ', $searchTermBits) . ") 的方式肯定是不正确的。我不确定如何解决这些问题,任何见解或解决方案将不胜感激。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    在构建数据库查询时,您需要从输入字段中获取术语并遍历所有术语。您还需要设置要在其中搜索术语的表字段,在此示例中,表字段为name。这是一个未经测试的示例,但您会明白的。

    public function search() {
    
        $q = Input::get('myInputField');
    
        $searchTerms = explode(' ', $q);
    
        $query = DB::table('products');
    
        foreach($searchTerms as $term)
        {
            $query->where('name', 'LIKE', '%'. $term .'%');
        }
    
        $results = $query->get();
    
    }
    

    【讨论】:

    • 我有一个名为 search 的字段,它有一个触发器,可以自动组合几个关键字段,例如名称、品牌、类型、年份等。这样,只有一个字段可供搜索。我希望查询基本上分解为:SELECT * FROM products WHERE search LIKE '%burton%' AND search LIKE '%snowboards%' 这不是解决此问题的正确方法吗?
    • @MitchGlenn 你测试过代码吗? foreach 循环内有一个 $query,它完全按照您在评论中所说的那样做。可链接 where() 的构建 AND 查询。您可以看到通过执行dd(DB::getQueryLog()) 产生的查询
    • 应该是没有's'的DB::table(…)
    • 如何清理此查询?我的意思是要确保,正在搜索的数据库术语实际上不是另一个向新用户授予权限的调用?
    【解决方案2】:

    我为 laravel 制作了一个插件来制作这个!希望您使用它并提供反馈。 您可以指定每列的相关性并使用其他表中的信息

    https://github.com/nicolaslopezj/searchable

    你可以这样搜索

    $products = Product::search($query)->get();
    

    【讨论】:

    • 很棒的插件!!谢谢!
    【解决方案3】:

    控制器功能1

     public function search() {
        $q           = Input::get('searchKeyWords');
        $users       = DB::table('users');
            $results = $users->where('name', 'LIKE', '%'. $q .'%')
            ->orWhere('email', 'LIKE', '%'. $q .'%')
            ->orWhere('password', 'LIKE', '%'. $q .'%')
            ->get();
        return View::make('users.search')->with('users', $results);
    }
    

    控制器功能2

     public function search() {
        $q = Input::get('searchKeyWords');
            $results = User::where('name', 'LIKE', '%'. $q .'%')
            ->orWhere('email', 'LIKE', '%'. $q .'%')
            ->orWhere('password', 'LIKE', '%'. $q .'%')
            ->get();
        return View::make('users.search')->with('users', $results);
    }
    

    控制器功能3

    public function search() {
            $results = User::where('name', 'LIKE', '%'. Input::get('searchKeyWords') .'%')
            ->orWhere('email', 'LIKE', '%'. Input::get('searchKeyWords') .'%')
            ->orWhere('password', 'LIKE', '%'. Input::get('searchKeyWords') .'%')
            ->get();
        return View::make('users.search')->with('users', $results);
    }
    

    【讨论】:

      【解决方案4】:

      这是我尝试将 Eloquent 与许多搜索词结合使用时的示例

      public function search() {
      
          $q = Input::get('myInputField');
      
          $searchTerms = explode(' ', $q);
      
          $query = $article->where('title', 'LIKE', "%{$keyword}%")
                   ->orWhere('description', 'LIKE', "%{$keyword}%");
      
          foreach($searchTerms as $term)
          {
              $query = $query->orWhere('name', 'LIKE', '%'. $term .'%');
          }
      
          $results = $query->get();
      
      }
      

      您也可以将->get()函数更改为->paginate()等其他结果,它应该类似于$results = $query->paginate(10);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        • 2015-02-23
        • 2021-12-17
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多