LoginSignup
3
3

More than 1 year has passed since last update.

PHP・Laravelで検索機能を実装(備忘録)

Last updated at Posted at 2021-05-16

概要

PHP・Laravelで簡単な記事投稿アプリを作成してます。
検索機能を実装したので、備忘録として残しておきます。

ビュー

index.blade.php(formタグのみ記載)
<form method="GET" action="{{ route('articles.index') }}" class="d-flex">
    <input class="form-control me-2" name="search" type="search" placeholder="検索" aria-label="Search">
    <button class="btn btn-outline-success" type="submit">検索する</button>
</form>

bootstrapのナビバーに検索フォームがあるので、該当箇所をコピペしてください。
データを渡すにはname属性が必要になるので、name="search"を追記します。
また、formでキーワードを取得するので、formタグの中にmethod(データベースに保存はしないので"GET"でOK)とaction(ルートを指定)を追記します。

コントローラー

ArticleController.php(indexアクションのみ記載)
public function index(Request $request)
{
    $search = $request->input('search');
    $query = Article::query();

    if (!empty($search)) {
        $query->where('title', 'LIKE', "%{$search}%")
        ->orWhere('body', 'LIKE', "%{$search}%");
    }

    $articles = $query->get()->sortByDesc('created_at');

    return view('articles.index', ['articles' => $articles]);
}

formの値を持ってくるために、Requestクラスのインスタンスをindexアクションの引数に渡しています。
$search = $request->input('search');では、index.blade.phpに書いたname="search"からデータを持ってきて、変数に代入します。

(indexアクションの一部を抜粋)
$query = Article::query();

if (!empty($search)) {
    $query->where('title', 'LIKE', "%{$search}%")
    ->orWhere('body', 'LIKE', "%{$search}%");
}

$articles = $query->get()->sortByDesc('created_at');

ここでクエリビルダでクエリを組み立てています。
$searchが空ではない場合は、whereメソッドを実行します。
 ・第1引数・・・検索するテーブル名を指定する。
 ・第2引数・・・曖昧検索をするためにオペレーターとしてLIKEを使用する。
 ・第3引数・・・変数の前後に%を入れて部分一致を行う。%は曖昧検索を指示する記号のことで、0文字以上の任意の文字列を表す。
最後にgetメソッドで構成してきたクエリによるデータを取得し、作成日時が新しい順に並べています。

参考記事

Laravelで検索機能の実装 [基本]
Laravel 6.x データベース:クエリビルダ
【SQL】意外と簡単!これならわかるLIKE句でのあいまい検索
【Laravel】検索機能の実装
laravelで検索機能を実装する

補足情報

PHP 7.4.1
Laravel 6.20.26

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3