Spatie Searchableパッケージで、Laravelで簡単に検索フォームを設置する方法を解説します。
Googleの検索ボックスは会員制サイトはムリ。
ScoutとAlgoriaを使う方法もありますが、Algoriaは一定以上利用すると有料になります。
「回数制限付きだと落ち着かない」
「条件なしで無料で使いたい!」
という場合には、今回ご紹介するパッケージがおすすめ。
Laravelでサイト内全文検索フォームを無料で簡単に設置する方法
今回は、textsテーブルのbodyカラムを検索するフォームを作っていきます。
データベース内のテーブルは、このような構造になっています。

今回はこの中の bodyカラムの中身を検索。
検索結果は titleカラムを表示するようにします。
仕上がりイメージはこちら。

①パッケージインストール
まずはパッケージをインストールしましょう。
| 
					 1  | 
						composer require spatie/laravel-searchable  | 
					
②モデルファイルを編集
次に検索対象のモデルファイルを開きます。
一番上にuse宣言を入れ、さらにimplements Searchableと加えます。
さらに getSearchResultメソッドを追加。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Spatie\Searchable\Searchable; use Spatie\Searchable\SearchResult; class Text extends Model implements Searchable {     use HasFactory;     protected $guarded = [];     public function getSearchResult(): SearchResult     {         // A.検索結果のリンク先となるルートを入れる        $url = route('text.show', $this->id);         return new SearchResult(            $this,         //    B.検索結果で表示したいカラムを入れる            $this->title,            $url         );     }  | 
					
メソッド内のAとBの部分は、状況に応じて変更してください。
Aは検索結果のリンク先となります。
通常は (モデル名.show) のルート設定を入れておきます。
Bは検索結果で表示したいカラムを入れます。
③ ルート設定を作成
次に、ルート設定を作成しておきます。
| 
					 1 2 3  | 
						    // search routes     Route::get('/search', 'SearchController@index')->name('search.index');     Route::get('/search/result', 'SearchController@result')->name('search.result');  | 
					
④ コントローラーを作成
次に、コントローラーを作成します。
| 
					 1  | 
						php artisan make:controller SearchController  | 
					
コントローラーの最初に、searchableと、検索に使うモデルのためのuse宣言を入れます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  | 
						<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Spatie\Searchable\Search; use App\Models\Text; class SearchController extends Controller {     public function index()     {         return view('home');     }     public function result( Request $request)     {         $searchResults = (new Search())                     // C 検索するモデル名と、カラムを指定                     ->registerModel(Text::class, 'body')                     ->perform($request->input('query'));         return view('search.result', compact('searchResults'));     } }  | 
					
C には検索するモデル名と、カラムを入れます。
これで下準備完了。
⑤ 検索ボックスを作成
次にビュー部分を作っていきます。
最初に検索ボックスですが、action に先ほど作成した search.result を設定する以外は、通常どおり。
デザインはお好きなものにしてください。
| 
					 1 2 3 4 5  | 
						      <form action="{{ route('search.result') }}" method="GET">         @csrf         <input type="text" name="query">         <input type="submit">       </form>  | 
					
⑥ 検索結果表示画面を作成
次にroutes/views の中にsearchフォルダを作り、その中にresult.blade.phpファイルを作成します。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						"{{ request('query') }}"について{{ $searchResults->count() }} 件の検索結果がありました。 <div class="card-body">     @foreach($searchResults->groupByType() as $type => $modelSearchResults)         @foreach($modelSearchResults as $searchResult)             <ul>                 <li><a href="{{ $searchResult->url }}">{{ $searchResult->title }}</a></li>             </ul>         @endforeach     @endforeach </div>  | 
					
これで出来上がり。
なお、検索対象のモデル(テーブル)は複数設定できます。
その場合、他のモデルも同じように設定します。
さらにコントローラーの「C 」の部分をコピペし、追加したモデルの情報も入れるようにしてください。

素敵な検索ボックスを作って、サイトの使い勝手をあげいきましょう♪
  
  
  
  
