首页 > 解决方案 > 如何摆脱 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();
}

标签: phplaraveleloquent

解决方案


如果您对使用收集方法感兴趣,那么您可以使用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'));
})

有关更多信息,您可以查看文档中的条件子句。希望这可以帮助。


推荐阅读