如何在Laravel 5.4中实现搜索功能

时间:2017-08-22 10:24:22

标签: php laravel laravel-5.4

我是Laravel的新手并且有一些理解问题如何在我的应用中实现搜索功能。

到目前为止我的尝试。

我创建了一个从db获取数据的模型(这是有效的)

{
"documentrequest": {
"@type": "staff",
"@mode_display": "employ_and_dismiss",
"@get_photo": "true",
"@subdiv": "",
"staff": {
"staffnode": [
{
"@last_name": "Андреев",
"@first_name": "Андрей",
"@middle_name": "Андреевич",
"@id_internal": "11100",
"@id_external": "" ......

我的控制器看起来像这样:

class Post extends Model
{
    public static function scopeSearch($query, $searchTerm)
    {
        return $query->where('city', 'like', '%' .$searchTerm. '%')
                     ->orWhere('name', 'like', '%' .$searchTerm. '%');
    }
}

随着php artisan修补,模型正在运作。我正在获取数据库查询。

在前端,我有一个带有提交按钮的简单输入字段:

use App\Post;

    class PostsController extends Controller
    {
        public function index(Request $request) 
        {
            $searchTerm = $request->input('searchTerm');
            $posts = Post::all()
            ->search($searchTerm);
            return view('posts.index', compact('posts', 'searchTerm'));
        }

       public function show($id)
       {
           $post = Post::find($id);
           return view('posts.show', compact('post'));
       }
    }

但是,现在,如果我在搜索输入字段中输入内容,如何从控制器检索数据?代码仅在我收到所有帖子时才起作用。我需要以某种方式包含来自控制器的<div class="container"> <div class="col-sm-8"> <form action="posts.index" method="GET"> {{csrf_field()}} <div class="input-group"> <input type="text" class="form-control" name="searchTerm" placeholder="Search for..." value="{{ isset($searchTerm) ? $searchTerm : '' }}"> <span class="input-group-btn"> <button class="btn btn-secondary" type="submit">Search</button> </span> </div> </form> </div> </div>

serachTerm

4 个答案:

答案 0 :(得分:3)

首先,您需要安装laravel scout

使用:composer require laravel/scout

接下来,您需要使用vendor:publish命令发布Scout配置。此命令会将scout.php发布到您的配置目录。

以下是命令:php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

最后一步将是您要使其可搜索的模型的特征Laravel\Scout\Searchable

然后将其简单地用作:NameOfModel::search($searchText)->get();

答案 1 :(得分:2)

检查一下:

$posts = Post::search($searchTerm)->get();

答案 2 :(得分:1)

您正在尝试获取所有记录然后应用范围功能,而不是尝试获取所有记录:

$searchTerm = $request->input('searchTerm');
$posts = Post::search($searchTerm);
return view('posts.index', compact('posts', 'searchTerm'));

答案 3 :(得分:1)

Laravel使搜索变得非常容易,以及实时搜索结果等自定义搜索等。只需确保在前端限制您的HTTP请求。

/**
 * Get a breed by name (returns similar results)
 * @param $term
 * @return \Illuminate\Http\JsonResponse
 */
public function getBreedByName($term)
{
    // Find an Breed by name
    $matchedTerm = Breed::where('text', 'LIKE', '%' . $term . '%')->get();
    return response()->json($matchedTerm);
}

然后在路线中创建对该控制器和方法的引用。就我而言,我在/routes/api.php中使用了以下内容

Route::get('/breeds/search/{term}', 'BreedsController@getBreedByName');

我希望这有用!如果您有任何问题,或者这不能解决您的问题,请与我们联系。