6

我正在尝试为用户创建一种搜索网站上所有产品的方法。当他们搜索“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 问题的第一个解决方案

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

4

4 回答 4

18

您需要从输入字段中获取术语并在构建数据库查询时遍历所有这些术语。您还需要设置要在其中搜索术语的表字段,在此示例中,表字段为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();

}
于 2013-10-26T21:50:21.740 回答
6

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

https://github.com/nicolaslopezj/searchable

你可以这样搜索

$products = Product::search($query)->get();
于 2014-08-22T03:41:27.170 回答
2

控制器功能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);
}
于 2015-01-19T11:28:14.633 回答
1

这是我尝试将 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);

于 2014-03-02T22:05:52.840 回答