#はじめに
最近、AWSを使用してデプロイ中だが進まずに苦戦中です・・・。その為、中々投稿ができずAWSが気になってしまう日々が続いております。
Qiitaの記事が溜まってきたので気分転換にアウトプットをします。製作物に検索機能を実装したのでこちらを備忘録として投稿します。
#投稿者の環境
MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
macOS Big Sur バージョン11.0.1
PHP 7.3.23
Laravel Framework 6.20.7
#条件
今回はスコープを使います。
理由は基本的なデータベースの操作を行いたい上に、毎回同じ検索条件を書くならEloquentのクエリスコープを使った方が楽だからです。
また、検索機能で使用する時にWhere句はよく使います。このWere句ですが、条件式をモデルに定義(スコープ機能)して使いまわすことができます。今後、複雑な検索機能を実装するための基本となりますので実装してみました。
#スコープを定義する
スコープを使用するには必ず最初にscopeを名前の初めに付ける
必要があります。
また、最初の変数には必ず$queryを使用します。
上記の条件を纏めると以下のような書き方になります。
//scopeの定義
public function scopeNameEqual($query, $変数)
{
return $query->where('検索したいカラム', $変数);
}
#モデルにスコープを使用
###ポイント1 use($serachword)
無名関数(クロージャー)を使用します。
###ポイント2 "%{$searchword}%"
ワイルドカード(今回は%を使用)を使って0文字以上の文字列を検索できるように組み込む。
public function scopeSearch($query, $searchword){
return $query->where(function ($query) use($searchword) {
$query->orWhere('name', 'like', "%{$searchword}%")
->orWhere('subject', 'like', "%{$searchword}%")
->orWhere('category', 'like', "%{$searchword}%")
->orWhere('message', 'like', "%{$searchword}%");
});
}
#コントローラーに表示させる
Request(DI)を使用してDBに保存されているデータを表示させ、searchwordをviewファイルに渡すように記述する。
public function index(Request $request) {
$searchword = $request->searchword;
$posts = Post::orderBy('created_at', 'desc') //新しい順に表示
->Search($searchword)
->paginate(10);
return view('bulletin-boards.index',['posts'=> $posts,'searchword' => $searchword]); //配列を使ってviewファイルに二つの変数を渡す。
}
#検索ボックスをindexファイルに作成
検索結果を表示させるだけなのでGETにします。
<form class="form-inline" method="GET" action="{{ route('bulletin-board.index') }}">
<input type="text" name="searchword" value="{{$searchword}}" class="form-control mr-sm-2" placeholder="キーワードを入力">
<button type="submit" class="search-box btn btn-info">検索</button>
</form>
</div>
#最後に
今回の検索機能は該当する箇所を全て出現させる単純な機能になります。今後はカテゴリー毎に検索できるように挑戦してみようと思います。
#参考文献
スコープ機能について
laravel リクエストを実行する
laravel 公式
ワイルドカードとは?
補足 正規表現とワイルドカードの違い