今回やろうとしたこと
・投稿一覧の中から検索条件に当てはまった投稿だけ表示させたい。
・selectタグを使用した検索がしたい。
・複数条件の絞り込み。
イメージ
formの中にselectタグを二つ用意しその値をコントローラに送りセレクト文で条件に合致する投稿だけ表示させる。
まず、検索する条件内容は変わらないのでjsonファイルに登録しておく。
*jsonファイル
- あらかじめ決まった値を保存しておくファイル
- https://qiita.com/shizen-shin/items/0d899fbff2c9e3ae12f4
jsonファイル
//今回はゲームの機材は何を使用しているのかとゲームの実力(ランク帯)を条件に検索する
{
"machine":{
"PC" : "PC",
"PS4" : "PS4"
},
"lank":{
"champion" : "チャンピオン",
"dia" : "ダイア",
"platina" : "プラチナ",
"gold" : "ゴールド",
"silver" : "シルバー",
"bronze" : "ブロンズ",
"copper" : "コッパー"
}
}
続いてControllerを書いていく。
public function search(Request $request){
// 絶対パスでjsonファイルを指定する
$url = public_path() ."/json/machin.json";
// jsonファイルのデータをとってきて$jsonに代入
$json = file_get_contents($url);
// $json(連想配列)の中身が文字化けしないようにする
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// 第二引数のturuを指定することで連想配列にする
$arr = json_decode($json,true);
}
一旦jsonファイルの中身をController側で取得する処理を書く
続いてviewのform部分を記載していくが、まず下記の認識を合わせておく
①$arrにはjsonファイルに保存しておいたmachineとlankの連想配列がそれぞれ入っている。
②ユーザーが条件を指定しないで検索する場合があるので、その場合は両方のセレクトタグに全選択を用意してあげてvalueにはallを指定しておく。
そうすることで何も指定しなかった場合にはmachineとlankにallの値が入る。
<form action="{{ route('posts.search') }}">
<select name="machine">
<option value="all">全選択</option>
@foreach($arr["machine"] as $key => $value)
{{-- machineの連想配列のkeyに入っている値を$valueとして回す --}}
<option value="{{ $value }}">{{ $value }}
</option>
@endforeach
</select>
<select name="lank">
<option value="all">全選択</option>
@foreach($arr["lank"] as $key => $value)
{{-- lankの連想配列のkeyに入っている値を$valueとして回す --}}
<option value="{{ $value }}">{{ $value }}
</option>
@endforeach
</select>
<button class="aaa" type="submit">検索する</button>
</form>
viweは完成!!
Controllerに戻りif文のところから追記
まず条件に以下の3点が発生することを想定している
①条件なし
②machineの条件だけ選択されてlankの条件は選択されない(all)
③lankの条件だけ選択されてのmachine条件は選択されない(all)
public function search(Request $request){
// 絶対パスでjsonファイルを指定する
$url = public_path() ."/json/machin.json";
// jsonファイルのデータをとってくる
$json = file_get_contents($url);
// 連想配列の中身が文字化けしないようにする
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// 第二引数のturuを指定することで連想配列にする
$arr = json_decode($json,true);
ーーーーーーーーーーーーーーーー下記を追記ーーーーーーーーーーーーーー
if($request->machine == $request->lank){
// 両方指定されていなければ全ての投稿をとってくる。
$posts = Post::get();
}elseif($request->lank == 'all'){
// lankが指定されていなければmachineの選択条件と一致したやつをとってくる
$posts = Post::where('message',$request->machine)->get();
}elseif($request->machine == 'all'){
// machineが指定されていなければlankの選択条件と一致したやつをとってくる
$posts = Post::where('grade',$request->lank)->get();
}else{
$posts = Post::where('grade',$request->lank)->where('message',$request->machine)->get();
}
$userId = Auth::id();
return view('posts.index', compact('posts','userId','arr'));
}
上記の方法で条件検索処理ができた。
初心者なので説明が下手くそだけどとりあえずコピペして試してみてね。