php - 如何摆脱 laravel 中过多的 if 语句?
问题描述
我想通过消除太多的 if 语句来创建一个更具可读性的代码,但仍然可以完成这项工作。我已经尝试创建一个私有方法并提取日期范围查询并返回构建器实例,但是每当我这样做时,它都不会返回正确的构建器查询结果,所以我最终会在这个方法上搞砸一切。
其他参数将很快添加,因此 if 语句会很快出现。:(
任何有关如何改进的提示将不胜感激。谢谢!
/**
* @param array $params
*
* @param $orderBy
* @param $sortBy
*
* @return Collection
*
* Sample:
* `/orders?release_date_start=2018-01-01&release_date_end=2018-02-20&firm_id=3` OR
* `/orders?claimId=3&status=completed`
*
* Problem: Too many if statements
*
*/
public function findOrdersBy(array $params, $orderBy = 'id', $sortBy = 'asc'): Collection
{
$release_date_start = array_get($params, 'release_date_start');
$release_date_end = array_get($params, 'release_date_end');
$claimId = array_get($params, 'claimId');
$firm_id = array_get($params, 'firm_id');
$status = array_get($params, 'status');
$orders = $this->model->newQuery();
if (!is_null($release_date_start) && !is_null($release_date_end)) {
$orders->whereBetween('releaseDate', [$release_date_start, $release_date_end]);
} else {
if (!is_null($release_date_start)) {
$orders->where('releaseDate', '>=', $release_date_start);
} else {
if (!is_null($release_date_end)) {
$orders->where('releaseDate', '<=', $release_date_end);
}
}
}
if (!is_null($claimId)) {
$orders->where(compact('claimId'));
}
if (!is_null($firm_id)) {
$orders->orWhere(compact('firm_id'));
}
if (!is_null($status)) {
$orders->where(compact('status'));
}
return $orders->orderBy($orderBy, $sortBy)->get();
}
解决方案
如果您对使用收集方法感兴趣,那么您可以使用when()
收集方法来省略您的if-else
语句。所以根据你的说法,它看起来像:
$orders->when(!is_null($release_date_start) && !is_null($release_date_end), function($q) {
$q->whereBetween('releaseDate', [$release_date_start, $release_date_end]);
}, function($q) {
$q->when(!is_null($release_date_start), function($q) {
$q->where('releaseDate', '>=', $release_date_start);
}, function($q) {
$q->when(!is_null($release_date_end), function($q) {
$q->where('releaseDate', '<=', $release_date_end);
})
})
})
->when(!is_null($claimId), function($q) {
$q->where(compact('claimId'));
})
->when(!is_null($firm_id), function($q) {
$q->orWhere(compact('firm_id'));
})
->when(!is_null($status), function($q) {
$q->where(compact('status'));
})
有关更多信息,您可以查看文档中的条件子句。希望这可以帮助。
推荐阅读
- c# - MVC [Authorize] 属性适用于除主页之外的每个页面
- rabbitmq - 从 OS 映像克隆的 VM 上的 RabbitMQ 无法启动,可能是由于节点名称
- javascript - 如果我的接口对象具有相似的键,则尝试为它分配值?
- ruby-on-rails - 根据第三个属性按不同属性对 ActiveRecord 集合进行排序
- tfs - 如何在 TFS 2018 中为一组分析师授予自定义权限?
- julia - 让 Julia 出现在 JupyterLab
- android - 如何隐藏自定义微调器中的下拉箭头?
- python - Holoviews/Bokeh 区域图将 Hovertool 添加到区域图
- c# - 向后拖动滑块时删除WPF中的圆圈
- javascript - 如何在 react-native-vector 中使用图标?