概要
PHP・Laravelで簡単な記事投稿アプリを作成してます。
検索機能を実装したので、備忘録として残しておきます。
ビュー
<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(ルートを指定)を追記します。
コントローラー
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"
からデータを持ってきて、変数に代入します。
$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