Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Montar Query dinâmica

Criei um método estático para listar elementos do banco de dados, minha ideia é que essa consulta seja dinâmica, onde for chamado o método, pode-se passar as informações de consulta por parâmetro, até então esta funcionando bem, mas gostaria de saber se o padrão é aceitável, caso contrario existe alguma mais correta de se fazer este procedimento? Segue o código:

Chamada do método:

nomeDaClasse::loadTable(array('ORDER BY id'), 'nomes');

Método:

static function loadTable(array $conditions, $tabela){    
        if(ctype_alpha($tabela)){
            $query = Database::conexao()->query("SELECT * FROM $tabela ".implode(" ", $conditions));
            $query->execute();
            $stmt = $query->fetchAll();
            return $stmt;
        }
    }
4 respostas

Oi Mario, tudo bem? Achei até interessante a sua ideia, mas eu inverteria os parâmetros, colocaria as condições depois do nome da tabela.

Se eu não passar nenhuma condição, como esse código de comporta? E se não passar nada?

Este é um ponto bem interessante, pois eu tenho que passar alguma coisa, nem que seja um array vazio, posso até validar para implodir, se for o caso, mas se eu não receber um array para a variável $conditions, o erro de expected parameters acontece, então estou fazendo desta forma, quando não necessito de condições para a consulta no banco:

nomeDaClasse::loadTable([], 'nomes');

Seria essa uma forma adequada, existe outra maneira de tratar isso?

solução!

Eu inverteria a ordem por que me parece contra intuitivo informar as condições depois do nome da tabela. Veja que na query você precisa inverter as posições.

Para evitar ter que passar o array vazio sempre, você pode colocar um valor padrão direto no parâmetro da função:

static function loadTable($tabela, array $conditions = []){    
        if(ctype_alpha($tabela)){
            $query = Database::conexao()->query("SELECT * FROM $tabela ".implode(" ", $conditions));
            $query->execute();
            $stmt = $query->fetchAll();
            return $stmt;
        }
    }

Por que inverter os parâmetros? Isso vai permitir que você informe apenas um valor. Se você adicionar o valor padrão para o primeiro parâmetro e não pro segundo, você será obrigado a passar os dois parâmetros por que se passar só um valor, apenas o primeiro parâmetro será reconhecido, mesmo ele tendo um valor padrão.

Faz sentido?

Sim, faz sentido a melhoria, estarei aprimorando o código com essa dica , obrigado.