Refactor Laravel Eloquent Query - PullRequest
       39

Refactor Laravel Eloquent Query

0 голосов
/ 06 апреля 2020

Я хочу отфильтровать данные, данные из 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, а код грязный.

У кого-нибудь есть идея рефакторинг кода?

1 Ответ

1 голос
/ 06 апреля 2020

Идея: если ваша переменная установлена, вы проверяете ее. В противном случае не

Вы можете попробовать это ( это идея, а не фактический код )

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

.... и так далее

...