Search merge Laravel

0

I have the function in my controller:

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'];

        // cria o array que será utilizado no query builder
        $buscar_todos;
        $buscar_datas;

        // 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)){
            $celulares = Celular::where($buscar_todos)->get();
        } 

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


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

        return view('celulares.pesquisa', compact('celulares','marcas','modelos','cores','cidades','situacoes'));
    }  

But I'm not able to merge search fields along with dates, or search fields or dates only, I'd like to know how I can resolve this in the function.

    
asked by anonymous 15.05.2018 / 19:20

1 answer

0

I got a series of if and elseinf, I do not know if the most elegant way, but it worked, follow the code:

// 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();
        } 
    
15.05.2018 / 20:47