書籍「Laravelの教科書」Laravel13対応サポートガイド公開中 → ダウンロードはこちら

Laravelでサイト内に検索フォームを無料で簡単に設置する方法

Laravel・PHP豆知識・トラブル対策

Spatie Searchableパッケージで、Laravelで簡単に検索フォームを設置する方法を解説します。

Googleの検索ボックスは会員制サイトはムリ。
ScoutとAlgoriaを使う方法もありますが、Algoriaは一定以上利用すると有料になります。

「回数制限付きだと落ち着かない」
「条件なしで無料で使いたい!」

という場合には、今回ご紹介するパッケージがおすすめ。

Laravelでサイト内全文検索フォームを無料で簡単に設置する方法

今回は、textsテーブルのbodyカラムを検索するフォームを作っていきます。

データベース内のテーブルは、このような構造になっています。

今回はこの中の bodyカラムの中身を検索。

検索結果は titleカラムを表示するようにします。

仕上がりイメージはこちら。

①パッケージインストール

まずはパッケージをインストールしましょう。

composer require spatie/laravel-searchable

②モデルファイルを編集

次に検索対象のモデルファイルを開きます。

一番上にuse宣言を入れ、さらにimplements Searchableと加えます。

さらに getSearchResultメソッドを追加。

<?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は検索結果で表示したいカラムを入れます。

③ ルート設定を作成

次に、ルート設定を作成しておきます。

    // search routes
    Route::get('/search', 'SearchController@index')->name('search.index');
    Route::get('/search/result', 'SearchController@result')->name('search.result');

④ コントローラーを作成

次に、コントローラーを作成します。

php artisan make:controller SearchController

コントローラーの最初に、searchableと、検索に使うモデルのためのuse宣言を入れます。

<?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 を設定する以外は、通常どおり。

デザインはお好きなものにしてください。

      <form action="{{ route('search.result') }}" method="GET">
        @csrf
        <input type="text" name="query">
        <input type="submit">
      </form>

⑥ 検索結果表示画面を作成

次にroutes/views の中にsearchフォルダを作り、その中にresult.blade.phpファイルを作成します。

"{{ 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 」の部分をコピペし、追加したモデルの情報も入れるようにしてください。

じゅんこ
じゅんこ

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

Laravel・PHP豆知識・トラブル対策

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる
 

生成AIを「安全に」使うための研修・セミナー

お問い合わせ

生成AIの業務活用で気になるのは、効率だけでなくセキュリティです。 実践的な活用に加え、セキュリティ対策もお伝えします。

詳細を見てみる

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新版Laravel13への対応に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

最新のLaravel13に対応。Laravel8からの各バージョンのテキストもご覧になれます♪

Laravelの本を書きました。


ひつじが目印♪

Laravelの使い方を分かりやすく解説した本を書きました。 書店やAmazon等のオンラインショップにて販売中
最新版Laravel13対応用サポートガイド(PDF)あり

書籍の詳細を見てみる

Laravelの本書きました。


ひつじが目印♪
クリックするとamazonページへ。
最新版Laravel13対応用
サポートガイド(PDF)あり

書籍の詳細を見てみる
シェアする
Twitter始めました。

コメント

タイトルとURLをコピーしました