Reduce function in the controller laravel

0

I would like to know if you have how to rewrite the function below in a cleaner way, without so many if / elseif.

public function pesquisa(Request $request)
    {
        if (! Gate::allows('celular')) {
            return abort(401);
        }

        $marcas = CelularMarca::orderBy('nome', 'asc')->pluck('nome','id')->all();
        $modelos = CelularModelo::orderBy('nome', 'asc')->pluck('nome','id')->all();
        $cores = Cor::orderBy('nome', 'asc')->pluck('nome','id')->all();
        $cidades = Cidade::orderBy('nome', 'asc')->pluck('nome','id')->all();
        $situacoes = CelularSituacao::orderBy('nome', 'asc')->pluck('nome','id')->all();

        $buscar_marca = $request['marca_id'];
        $buscar_modelo = $request['modelo_id'];
        $buscar_cor = $request['cor_id'];
        $buscar_cidade = $request['cidade_id'];
        $buscar_data_inicial = $request['data_inicial'];
        $buscar_data_final = $request['data_final'];
        $buscar_bou = $request['bou'];
        $buscar_imei1 = $request['imei1'];
        $buscar_situacao = $request['situacao_id'];


        // verifica se buscou marca
        if($buscar_marca) {
            $buscar_todos[] = ['marca_id', $buscar_marca];
        }

        // verifica se buscou modelo
        if($buscar_modelo) {
            $buscar_todos[] = ['modelo_id', 'like', '%'.$buscar_modelo.'%'];
        }

        // verifica se buscou cor
        if($buscar_cor) {
            $buscar_todos[] = ['cor_id', $buscar_cor];
        }  

        // verifica se buscou cidade
        if($buscar_cidade) {
            $buscar_todos[] = ['cidade_id', $buscar_cidade];
        }   

        // verifica se buscou data
        if($buscar_data_inicial) {
            $buscar_datas[] = ['data_inicial', $buscar_data_inicial];
        }  

        // verifica se buscou data
        if($buscar_data_final) {
            $buscar_datas[] = ['data_inicial', $buscar_data_final];
        }         

        // verifica se buscou BOU
        if($buscar_bou) {
            $buscar_todos[] = ['bou', $buscar_bou];
        }

        // verifica se buscou IMEI1
        if($buscar_imei1) {
            $buscar_todos[] = ['imei1', 'like', '%'.$buscar_imei1.'%'];
        }

        // verifica se buscou situação
        if($buscar_situacao) {
            $buscar_todos[] = ['situacao_id', $buscar_situacao];
        }

       // verifica se há valores para utilizar no 'where'
        if(isset($buscar_todos, $buscar_data_inicial, $buscar_data_final)){  
            $celulares = Celular::where($buscar_todos)
            ->whereBetween('data',[$buscar_data_inicial, $buscar_data_final])
            ->get();
        }

        elseif(isset($buscar_todos, $buscar_data_inicial)){  
            $celulares = Celular::where($buscar_todos)
            ->whereBetween('data',[$buscar_data_inicial, date('Y-m-d')])
            ->get();
        }

        elseif(isset($buscar_todos, $buscar_data_final)){  
            $celulares = Celular::where($buscar_todos)
            ->where('data','<=',$buscar_data_final)
            ->get();
        }

        elseif (isset($buscar_todos)) {
            $celulares = Celular::where($buscar_todos)
            ->get();
        } 

        elseif (isset($buscar_data_inicial, $buscar_data_final)) {
            $celulares = Celular::whereBetween('data',[$buscar_data_inicial, $buscar_data_final])
            ->get();
        }

        elseif (isset($buscar_data_inicial)) {
            $celulares = Celular::whereBetween('data',[$buscar_data_inicial, date('Y-m-d')])
            ->get();
        } 

        elseif (isset($buscar_data_final)) {
            $celulares = Celular::where('data','<=',$buscar_data_final) 
            ->get();
        } 

        else{
            $celulares = Celular::all();
        } 

        return view('celulares.pesquisa', compact('celulares','marcas','modelos','cores','cidades','situacoes'));
    } 
    
asked by anonymous 18.05.2018 / 14:24

1 answer

0

Hi, I have improved the code, there are no syntax errors, but I would have to confirm wheres logic in select, it was not very clear how to stay.

$marcas = CelularMarca::orderBy('nome', 'asc')->pluck('nome','id')->all();
$modelos = CelularModelo::orderBy('nome', 'asc')->pluck('nome','id')->all();
$cores = Cor::orderBy('nome', 'asc')->pluck('nome','id')->all();
$cidades = Cidade::orderBy('nome', 'asc')->pluck('nome','id')->all();
$situacoes = CelularSituacao::orderBy('nome', 'asc')->pluck('nome','id')->all();

$buscas = [
    'marca_id' => $request['marca_id'],
    'modelo_id' => $request['modelo_id'],
    'cor_id' => $request['cor_id'],
    'cidade_id' => $request['cidade_id'],
    'bou' => $request['bou'],
    'imei1' => $request['imei1'],
    'situacao_id' => $request['situacao_id']
];

$buscar_datas = [
    'data_inicial' => $request['data_inicial'],
    'data_final' => $request['data_final']
];

foreach ($buscas as $index => $buscar) {
    if (in_array($index, ['modelo_id', 'imei1'])) {
        $buscar_todos[] = [$index, 'like', "%$buscar%"];
    }
    if (!empty($buscar)) {
        $buscar_todos[] = [$index, $buscar];
    }
}

if (!empty($buscar_datas['data_inicial']) || !empty($buscar_data['data_final']) && !empty($buscar_todos)) {
    $celulares = Celular::where($buscar_todos);
        if (!empty($buscar_datas['data_inicial'])) {
            if (empty($buscar_datas['data_final'])) {
                $buscar_datas['data_final'] = date('Y-m-d');
            }
            $celulares
                ->whereBetween('data', [$buscar_datas['data_inicial'], $buscar_datas['data_final']])
                ->get();
        } elseif (!empty($buscar_data['data_final'])) {
            $celulares
                ->where('data','<=', $buscar_datas['data_final'])
                ->get();
        }
} else {
    $celulares = Celular::all();
}

return view('celulares.pesquisa', compact('celulares','marcas','modelos','cores','cidades','situacoes'));
    
22.05.2018 / 23:10