减少 if elseif 块 Laravel 过滤器
Reducing the if elseif block Laravel filter
嗨,我得到了一个 if
elseif
块,如下所示:
public function competetionList(Request $request) {
$currentAction = \Route::currentRouteAction();
// list($controller, $method) = explode('@', $currentAction);
// $controller = preg_replace('/.*\\/', '', $controller);
// $method = preg_replace('/.*\\/', '', $method);
// $data = $this->checkPermission($controller, $method);
$data = true;
if($data == true) {
if($request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id)
->where('sport_type',$request->$sport_type)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif($request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id', $request->sport_id)
->where('sport_type',$request->sport_type);
} elseif($request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id);
} elseif(!$request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_type' , $request->sport_type);
} elseif(!$request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_type' , $request->sport_type)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif($request->sport_id && !$request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif(!$request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0);
}
$competetionData = $competetion->orderBy('name')->get();
$response = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData
];
return response()->json($response); //@ sending response
} else {
$response = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
return response()->json($response); //@ sending response
}
}
我的问题是如何让它更简单??因为以后会有更多的滤镜!
请帮助我这个方法
如果你在laravel 5.4以上那么你可以使用when
方法
public function competetionList(Request $request) {
$data = true;
if($data == true) {
$query = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0);
$query->when(isset($request->sport_id), function ($q) {
return $q->where('sport_id' , $request->sport_id);
});
$query->when(isset($request->sport_type), function ($q) {
return $q->where('sport_type' , $request->sport_type);
});
$query->when(isset($request->to_date), function ($q) {
return $q->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
});
$competetionData = $query->orderBy('name')->get();
$response = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData
];
return response()->json($response); //@ sending response
} else {
$response = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
return response()->json($response); //@ sending response
}
}
如果有帮助请告诉我:)
这里是关于依赖注入而不是使用外观的更简单和更清晰的版本(例如 Illuminate\Routing\Router
而不是 Illuminate\Support\Facades\Route
)
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Router;
use Illuminate\Contracts\Routing\ResponseFactory;
/**
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Routing\Router $router
* @param \Illuminate\Contracts\Routing\ResponseFactory $responseFactory
* @return \Illuminate\Http\JsonResponse
*/
public function competetionList(Request $request, Router $router, ResponseFactory $responseFactory) {
// [$controller, $method] = explode('@', $router->currentRouteAction());
// $controller = preg_replace('/.*\\/', '', $controller);
// $method = preg_replace('/.*\\/', '', $method);
// $data = $this->checkPermission($controller, $method);
$data = true;
if ($data) {
$competetionData = Competetion::with(['sports', 'sporttype'])
->where('delete', 0)
->when($request->sport_id, function ($builder, $sport_id) {
return $builder->where('sport_id', $sport_id);
})
->when($request->sport_type, function ($builder, $sport_type) {
return $builder->where('sport_type', $sport_type);
})
->when($request->has(['from_date', 'to_date']), function ($builder) use ($request) {
return $builder->whereBetween('date', [$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
})
->orderBy('name')
->get();
$responseContent = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData,
];
}
else {
$responseContent = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
}
return $responseFactory->json($responseContent);
}
创建一个 where 条件数组:
$arrayQuery [0] = ['delete', '=', 0];
if($request->sport_id! =null) {
array_push($arrayQuery, ['sport_id', $request->sport_id]) ;
}
对于每个 $request->xxxxx 依此类推。
他们提出查询:
$competetion = Competetion::with(['sports','sporttype'])->where($arrayQuery) - >get() ;
嗨,我得到了一个 if
elseif
块,如下所示:
public function competetionList(Request $request) {
$currentAction = \Route::currentRouteAction();
// list($controller, $method) = explode('@', $currentAction);
// $controller = preg_replace('/.*\\/', '', $controller);
// $method = preg_replace('/.*\\/', '', $method);
// $data = $this->checkPermission($controller, $method);
$data = true;
if($data == true) {
if($request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id)
->where('sport_type',$request->$sport_type)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif($request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id', $request->sport_id)
->where('sport_type',$request->sport_type);
} elseif($request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id);
} elseif(!$request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_type' , $request->sport_type);
} elseif(!$request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_type' , $request->sport_type)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif($request->sport_id && !$request->sport_type && $request->to_date && $request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0)
->where('sport_id' , $request->sport_id)
->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
} elseif(!$request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
$competetion = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0);
}
$competetionData = $competetion->orderBy('name')->get();
$response = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData
];
return response()->json($response); //@ sending response
} else {
$response = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
return response()->json($response); //@ sending response
}
}
我的问题是如何让它更简单??因为以后会有更多的滤镜!
请帮助我这个方法
如果你在laravel 5.4以上那么你可以使用when
方法
public function competetionList(Request $request) {
$data = true;
if($data == true) {
$query = Competetion::with(['sports','sporttype'])
->where('delete' , '=' , 0);
$query->when(isset($request->sport_id), function ($q) {
return $q->where('sport_id' , $request->sport_id);
});
$query->when(isset($request->sport_type), function ($q) {
return $q->where('sport_type' , $request->sport_type);
});
$query->when(isset($request->to_date), function ($q) {
return $q->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
});
$competetionData = $query->orderBy('name')->get();
$response = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData
];
return response()->json($response); //@ sending response
} else {
$response = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
return response()->json($response); //@ sending response
}
}
如果有帮助请告诉我:)
这里是关于依赖注入而不是使用外观的更简单和更清晰的版本(例如 Illuminate\Routing\Router
而不是 Illuminate\Support\Facades\Route
)
<?php
use Illuminate\Http\Request;
use Illuminate\Routing\Router;
use Illuminate\Contracts\Routing\ResponseFactory;
/**
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Routing\Router $router
* @param \Illuminate\Contracts\Routing\ResponseFactory $responseFactory
* @return \Illuminate\Http\JsonResponse
*/
public function competetionList(Request $request, Router $router, ResponseFactory $responseFactory) {
// [$controller, $method] = explode('@', $router->currentRouteAction());
// $controller = preg_replace('/.*\\/', '', $controller);
// $method = preg_replace('/.*\\/', '', $method);
// $data = $this->checkPermission($controller, $method);
$data = true;
if ($data) {
$competetionData = Competetion::with(['sports', 'sporttype'])
->where('delete', 0)
->when($request->sport_id, function ($builder, $sport_id) {
return $builder->where('sport_id', $sport_id);
})
->when($request->sport_type, function ($builder, $sport_type) {
return $builder->where('sport_type', $sport_type);
})
->when($request->has(['from_date', 'to_date']), function ($builder) use ($request) {
return $builder->whereBetween('date', [$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
})
->orderBy('name')
->get();
$responseContent = [
'status' => true,
'message' => 'Data Avialable',
'data' => $competetionData,
];
}
else {
$responseContent = [
'status' => false,
'message' => 'You Dont Have Permission To do it!',
];
}
return $responseFactory->json($responseContent);
}
创建一个 where 条件数组:
$arrayQuery [0] = ['delete', '=', 0];
if($request->sport_id! =null) {
array_push($arrayQuery, ['sport_id', $request->sport_id]) ;
}
对于每个 $request->xxxxx 依此类推。 他们提出查询:
$competetion = Competetion::with(['sports','sporttype'])->where($arrayQuery) - >get() ;