重构 Laravel Eloquent 查询

Refactor Laravel Eloquent Query

我想过滤来自 eloquent laravel 的数据。在我看来,我有 4 个日期选择器,我希望当每个日期选择器都已填充并具有查询更改的日期时。 这是我在控制器中的代码

if ($start_publish && $end_publish && $start_close && $end_close) {
                $data = Tender::where('published_at','>=',$start_publish)->where('published_at','<=',$end_publish)->where('closed_at','>=',$start_close)->where('closed_at','<=',$end_close);

}elseif (!$start_publish && $end_publish && $start_close && $end_close) {
                $data = Tender::where('published_at','<=',$end_publish)->where('closed_at','>=',$start_close)->where('closed_at','<=',$end_close);

} elseif ($start_publish && !$end_publish && $start_close && $end_close) {
                $data = Tender::where('published_at','>=',$start_publish)->where('closed_at','>=',$start_close)->where('closed_at','<=',$end_close);

} elseif (!$start_publish && !$end_publish && $start_close && $end_close) {
                $data = Tender::where('closed_at','>=',$start_close)->where('closed_at','<=',$end_close);

} elseif ($start_publish && $end_publish && !$start_close && $end_close) {
                $data = Tender::where('published_at','>=',$start_publish)->where('published_at','<=',$end_publish)->where('closed_at','<=',$end_close);
            }
            elseif ($start_publish && $end_publish && $start_close && !$end_close) {
                ...
                ...
                ...
        } else {
            $data = Tender::get();
        }

因为我有4个输入,条件的状态数等于16,代码比较乱

有没有人有重构代码的想法?

想法:如果设置了变量,则检查它。否则不

你可以试试这个(这是一个想法,不是实际代码

$builder = Tender::query();
if($start_publish) $builder->where('published_at','>=',$start_publish);
if($start_close) $builder->where('closed_at','>=',$start_close);
...
return $builder->get()

.....等等