– 複数の入力フォームから、ユーザの入力値に応じて、belongsToのテーブルも検索したい
### blade
{!! Form::open(['method'=>'POST', 'action'=>'SearchController@index']) !!} // 省略 {!! Form::close() !!}
### model
public function user(){ return $this->belongsTo('App\User'); }
### route
Route::match(['get','post'],'/search', 'SearchController@index');
### controller
– Data::query()->whereHas(‘user’, function($q){})で検索する
– 検索時にユーザ入力の変数で検索したい場合は、whereHas(‘user’, function($q) use($inputs){} として、渡す
public function index(Request $request){ if($request->isMethod('post')){ $inputs = $request->all(); $query = Data::query(); if(!empty($inputs['start'])){ $query->where('start_at','>=', date('Y-m-d', strtotime($inputs['start'])) ); } // 省略 // 名前検索 if(!empty($inputs['name'])){ $works = $query->whereHas('user', function($q) use($inputs){ $q->where('last_name','like', '%'.$inputs['name'].'%')->orWhere('first_name','like', '%'.$inputs['name'].'%'); })->orderBy('start','ASC')->paginate(10); } else { $data = $query->orderBy('start','ASC')->paginate(10); } } else { $data = Data::whereMonth('start', '=', date('m'))->orderBy('start','ASC')->paginate(10); } // 省略
whereHas(‘user’, function($q, $inputs){} で上手く行きそうな気がしたのですがエラーに成ります。
入力フォームの設置順に検索するのではなく、DBのリレーション順に検索をかけるので、注意が必要です。