【问题标题】:How to implement search function in Laravel 5.4如何在 Laravel 5.4 中实现搜索功能
【发布时间】:2017-08-22 10:24:21
【问题描述】:

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

到目前为止我已经尝试过什么。

我创建了一个从数据库中获取数据的模型(这正在工作)

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

我的控制器如下所示:

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'));
       }
    }

使用 php artisan tinker,模型可以正常工作。我正在获取数据库查询。

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

<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

@extends('layouts.master')

@section('content')
<div class="col-sm-8 blog-main">
    @foreach($posts as $post)
        <div class="card" style="margin-bottom: 10px">
            <div class="card-block">
                <h3 class="card-title">{{ $post->Name1 }}</h3>
                <small>Created at: {{ $post->created_at->toFormattedDateString() }}</small>
                <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
                <a href="{{$post->id}}" class="btn btn-primary">Details</a>
            </div>
        </div>
    @endforeach

</div>
@endsection

【问题讨论】:

    标签: php laravel laravel-5.4


    【解决方案1】:

    首先你需要安装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)-&gt;get();

    【讨论】:

      【解决方案2】:

      检查一下:

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

      【讨论】:

      • 只是为了扩展这一点,当您执行 Post::all() 时,它会立即执行查询,因此不会应用搜索查询范围。因此,应用此处答案中的范围,然后您必须调用 get() 才能实际执行查询并获取结果。
      • 确保在你的项目中添加 larqavel/scout 并在使用 search() 之前将 trait 添加到模型中
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        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');
        

        我希望这会有所帮助!如果您有任何问题或本文未涵盖您的问题,请告诉我。

        【讨论】:

          猜你喜欢
          • 2019-11-04
          • 2021-01-08
          • 2022-07-07
          • 2019-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多