如何简化 if elseif 语句以从 laravel MySQL 数据库中获取特定的搜索数据
how to simplify if elseif statement to get particular search data from laravel MySQL database
我正在从变量数据中的控制器收集所有数据,如 id、名称、日期、empid
$data = $request->all();
现在我想 select mysql table 中的所有行基于我从这样的请求中收到的输入值。
如果没有给出值则 select 全部来自 DB
if ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::get();
如果只给出特定的输入值
elseif ($data['keyvalue'] !== '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->Where('sr_name','LIKE','%'.$data['keyvalue'].'%')
->orWhere('tel_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('country_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('currency_name','LIKE','%'.$data['keyvalue'].'%')
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] !=='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','>=',$data['datefrom'])
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] !=='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','<=',$data['dateto'])
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] !=='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->Where('prep_emp','LIKE','%'.$data['prepid'].'%')
->orderBy('sr_id')
->get();
}
如果所有输入值都已给出
elseif ($data['keyvalue'] !== '' && $data['datefrom'] !=='' && $data['dateto'] !=='' && $data['prepid'] !=='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','>=',$data['datefrom'])
->whereDate('created_at','<=',$data['dateto'])
->Where('sr_name','LIKE','%'.$data['keyvalue'].'%')
->orWhere('tel_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('country_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('currency_name','LIKE','%'.$data['keyvalue'].'%')
->Where('prep_emp','LIKE','%'.$data['prepid'].'%')
->orderBy('sr_id')
->get();
}
一切正常我只是想简化这段代码..
你可以这样做:
$country = null;
if ($value0 !== null)
{
$country = $country ?? Country::where('query0 here');
}
else if ($value1 !== null)
{
$country = $country ?? Country::where('query1 here');
}
...
// end of your else ifs
// you do not need to check if all of the value exist because
// the query when all of the value exist and the partial value
// exist combined is just the same
$country = $country ?? $country->get();
您可以使用 when()
有条件的方法。
https://laravel.com/docs/8.x/queries#conditional-clauses
$countries = Country::when($request->filled('status'), function ($query) use ($request) {
$query->where('sr_status', 'LIKE', "%{$request->input('status')}%");
})->when($request->filled('datefrom'), function ($query) use ($request) {
$query->whereDate('created_at', '>=', $request->input('datefrom'));
})->when($request->filled('dateto'), function ($query) use ($request) {
$query->whereDate('created_at', '<=', $request->input('dateto'));
})->when($request->filled('keyvalue'), function ($query) use ($request) {
$query->Where('sr_name', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('tel_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('country_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('currency_name', 'LIKE', "%{$request->input('keyvalue')}%");
})->when($request->filled('prepid'), function ($query) use ($request) {
$query->where('prep_emp', 'LIKE', "%{$request->input('prepid')}%");
})->orderBy('sr_id')->get();
我正在从变量数据中的控制器收集所有数据,如 id、名称、日期、empid
$data = $request->all();
现在我想 select mysql table 中的所有行基于我从这样的请求中收到的输入值。
如果没有给出值则 select 全部来自 DB
if ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::get();
如果只给出特定的输入值
elseif ($data['keyvalue'] !== '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->Where('sr_name','LIKE','%'.$data['keyvalue'].'%')
->orWhere('tel_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('country_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('currency_name','LIKE','%'.$data['keyvalue'].'%')
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] !=='' && $data['dateto'] =='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','>=',$data['datefrom'])
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] !=='' && $data['prepid'] =='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','<=',$data['dateto'])
->orderBy('sr_id')
->get();
}elseif ($data['keyvalue'] == '' && $data['datefrom'] =='' && $data['dateto'] =='' && $data['prepid'] !=='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->Where('prep_emp','LIKE','%'.$data['prepid'].'%')
->orderBy('sr_id')
->get();
}
如果所有输入值都已给出
elseif ($data['keyvalue'] !== '' && $data['datefrom'] !=='' && $data['dateto'] !=='' && $data['prepid'] !=='' ){
$country = country::where('sr_status','LIKE','%'.$data['status'].'%')
->whereDate('created_at','>=',$data['datefrom'])
->whereDate('created_at','<=',$data['dateto'])
->Where('sr_name','LIKE','%'.$data['keyvalue'].'%')
->orWhere('tel_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('country_code','LIKE','%'.$data['keyvalue'].'%')
->orWhere('currency_name','LIKE','%'.$data['keyvalue'].'%')
->Where('prep_emp','LIKE','%'.$data['prepid'].'%')
->orderBy('sr_id')
->get();
}
一切正常我只是想简化这段代码..
你可以这样做:
$country = null;
if ($value0 !== null)
{
$country = $country ?? Country::where('query0 here');
}
else if ($value1 !== null)
{
$country = $country ?? Country::where('query1 here');
}
...
// end of your else ifs
// you do not need to check if all of the value exist because
// the query when all of the value exist and the partial value
// exist combined is just the same
$country = $country ?? $country->get();
您可以使用 when()
有条件的方法。
https://laravel.com/docs/8.x/queries#conditional-clauses
$countries = Country::when($request->filled('status'), function ($query) use ($request) {
$query->where('sr_status', 'LIKE', "%{$request->input('status')}%");
})->when($request->filled('datefrom'), function ($query) use ($request) {
$query->whereDate('created_at', '>=', $request->input('datefrom'));
})->when($request->filled('dateto'), function ($query) use ($request) {
$query->whereDate('created_at', '<=', $request->input('dateto'));
})->when($request->filled('keyvalue'), function ($query) use ($request) {
$query->Where('sr_name', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('tel_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('country_code', 'LIKE', "%{$request->input('keyvalue')}%")
->orWhere('currency_name', 'LIKE', "%{$request->input('keyvalue')}%");
})->when($request->filled('prepid'), function ($query) use ($request) {
$query->where('prep_emp', 'LIKE', "%{$request->input('prepid')}%");
})->orderBy('sr_id')->get();