この記事の背景
Laravelで検索機能を実装したのでその時のことを書いていきます。
キーワードを検索して部分一致で検索できる機能です。
検索機能の条件
1.ログインユーザー、未ログインユーザーでも検索できる
2.ユーザーの投稿を検索する機能
3.部分一致
特に1のログインユーザー、未ログインユーザーでも検索できる状態でないと
仕様としてあまり良くないみたいです。
こちらの記事も参考にしてください。
ルーティング
ルーティングの書き方です。トップページで検索する機能です。
web.php
//トップページ
Route::get('/', 'PostController@index')->name('post.index');
Controller
Controllerの説明をしていきます。
PostController.php
public function index(Request $request)
{
$search = $request->input('keyword');//リクエストからkeywordパラメーターの値を取得し、$search変数に代入、ユーザーが検索フォームに入力したキーワードが格納される
$query = Posts::query();Posts //モデルに対してクエリビルダを作成し、$query変数に代入してこのクエリビルダを使ってデータベースクエリを構築
if (!empty($search)) {//$search変数が空でない時、つまりユーザーがキーワードを入力した場合に、検索条件を追加
$query->where('text', 'LIKE', "%{$search}%");//textカラムがユーザーの入力したキーワードを部分一致で含む場合に検索条件を追加します。% はワイルドカード文字で、任意の文字列を表す
}
$posts = $query->orderBy('id','desc')->paginate(10);//クエリビルダに対して、id カラムで降順に並び替えを行い、ページネーションを適用し取得するデータは1ページあたり10件
return view('welcome', ['posts' => $posts, 'search' => $search]);//welcome ビューにデータを渡して、ビューを表示、$posts変数には検索結果が格納され、$search 変数にはユーザーが入力したキーワードが格納。ビュー内でこれらの変数を使用して結果を表示
}
view
検索フォームの見た目はこんな感じで作りました。
<form method="get" action="{{ route('post.index') }}" class="d-inline-block w-75">
<div class="form-group ">
<div class="input-group">
<input type="text" name="keyword" class="form-control" placeholder="検索" value="{{ request()->input('keyword') }}"autocomplete="on">
<div class="input-group-append">
<button type="submit" class="btn btn-success">検索</button>
</div>
</div>
</div>
</form>
参考資料
ChatGptで調べました。