いつもお世話になっています。
表題について、みなさんだったらどのようにソースコードを書くかというのを教えていただけると幸いです。
現在Laravelにて組み合わせ【プール】×【勤務地】検索フォームの実装をしています。
自分は以下のソースコードで、ひとまず動くようにしたのですが、
コントローラの書き方が異常にブサイクで、もっとイケメンになりたいです。
特に困っている部分はSearchController.phpにおける、
**【 # ここからもっといい感じに書きたい】**とコメントが書いてある行以下のif文になります。
ここまでは何とかして、無事検索も動くようになったのですが、
なんとも泥臭い書き方で、将来項目が増えた際に対応するのが大変な予感しかありません。
理想としては、
・キーワード検索と【プール】×【勤務地】の組み合わせ検索は同一フォームだけれども別々にしたい
・組み合わせ検索で【プール】×【勤務地】のどちらかがある場合、または両方のキーワードがある場合は、それぞれのキーワードを”×”で区切って、結合した状態で変数$keywordに格納したい
の2点になります。
php
1# index.blade.php 2 <h4 class="h5 font-weight-bold mt-4">プール</h4> 3 @foreach( $pools as $key => $value ) 4 <label class="checkbox-inline mb-1 mr-2 text-secondary">{!! Form::checkbox('pool', $key, false) !!} {{ $value }}</label> 5 @endforeach 6 7 <h4 class="h5 font-weight-bold mt-4">都道府県</h4> 8 @foreach( $prefectures as $key => $value ) 9 <label class="checkbox-inline mb-1 mr-2 text-secondary">{!! Form::checkbox('prefecture', $key, false) !!} {{ $value }}</label> 10 @endforeach 11 12 <h4 class="h5 font-weight-bold mt-4">キーワード検索</h4> 13 {!! Form::text('pool_name', null, ['class' => 'form-control','placeholder'=>'キーワード検索']) !!}
php
1# controller.php 2class SearchController extends Controller 3{ 4 5 private $pools; 6 private $prefectures; 7 private $query; 8 private $paginate_num = 2; 9 10 11 public function __construct() 12 { 13 $this->query = Pool::query(); 14 $this->prefectures = Place::$prefectures; 15 } 16 17 18 public function combination_search( Request $request ) 19 { 20 $pools = $request['pool']; 21 $request_prefecture = $request['prefecture']; 22 23 # ここからもっといい感じに書きたい 24 if( !empty( $request['pool_name'] ) ){ 25 26 # プール名 27 $keyword = $request['pool_name']; 28 $good_place = $this->query->where( 'pool_name', 'like', '%' . $keyword . '%' )->paginate( $this->paginate_num ); 29 30 } elseif( !empty( $pools || !empty( $request_prefecture ) ) ) { 31 32 if( !empty( $pools && !empty( $request_prefecture ) ) ){ 33 34 $keyword = $this->pools[ $pools ] . " × " . $this->prefectures[ $request_prefecture ]; 35 36 } elseif( !empty( $pools && empty( $request_prefecture ) ) ) { 37 38 $keyword = $this->pools[ $pools ]; 39 40 } elseif( empty( $pools && !empty( $request_prefecture ) ) ) { 41 42 $keyword = $this->prefectures[ $request_prefecture ]; 43 44 } 45 46 $params = [ 47 'pool', 48 'prefecture', 49 ]; 50 51 foreach( $request->only( $params ) as $key => $value ){ 52 $this->query->where( $key, 'like', '%' . $value . '%' ); 53 } 54 55 $good_place = $this->query->paginate( $this->paginate_num ); 56 57 } else { 58 59 # 検索条件の指定がなかった場合=新着情報 60 $keyword = "新着"; 61 $good_place = Pool::paginate( $this->paginate_num ); 62 63 } 64 65 return view( 'pool.list' )->with( [ 66 'good_place' => $good_place, 67 'keyword' => $keyword, 68 'pools' => $this->pools, 69 'contract_types' => $this->contract_types, 70 ] ); 71 } 72 73}
環境
PHP 7.1.23
Laravel Framework 5.8.7
以上となりますが、
お忙しいところ大変恐縮ですが、ご教授いただけると幸いです。
それでは宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。