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

SELECT seguindo as boas práticas

Bom dia, estou com a seguinte dúvida: digamos que eu tenha que efetuar 3 tipos de consultas ao meu BD, sendo 2 de acordo com o status(ativos e inativos) e outra consulta geral. Sendo assim, pensei em criar somente uma função em que caso eu passe o valor do $this->status(ativo ou inativo) ele executa a primeira query e casso o status não seja passado ele executa a segunta

    public function listaPessoas(){
        if($this->status) {
            $query = "SELECT id, nome, endereco FROM tb_pessoas WHERE status = :status ORDER BY id DESC";
        }
if($this->status == null){
            $query = "SELECT id, nome, endereco FROM tb_pessoas ORDER BY id DESC";
        }
        $connect = Connection::takeConnection();
        $listActive = $connect->prepare($query);
        $listActive->bindValue(':status', $this->status);
        $listActive->execute();
        return $list = $listActive->fetchAll();
    }

essa consulta está de acordo com as boas práticas do php ou é melhor criar uma função para pesquisar pelo status e outra para fazer a pesquisa geral? ou tem outra forma melhor?

8 respostas
Removido a pedido do usuario.

a implementação desse "else" melhora o código? pergunto isso porque sempre vejo os instrutores informando para evitar usá-lo e até mesmo para nunca usar.

Removido a pedido do usuario.

Opa Marcos, tudo bem?

A forma que você fez, funciona, mas a função em si, tem mais de um motivo para possível mudança. Se mais critérios precisarem ser levados em consideração para a listagem, essa função ficará cada vez mais complexa. Eu isolaria esse if em alguma outra função, ela seria responsável para criar a query de acordo com os critérios. É só uma forma de ver, não quer dizer que é a melhor alternativa nesse cenário.

A variável list é criada e retornada, mas não será utilizada. Então eu removeria essa atribuição no return. Ficaria apenas:

return $listActive->fetchAll();

obrigado pela atenção Wanderson. Deixa eu ver se entendi o que você falou:

public function listaPessoas(){
        $query = MontaQuery();
        $connect = Connection::takeConnection();
        $listActive = $connect->prepare($query);
        $listActive->bindValue(':status', $this->status);
        $listActive->execute();
        return $listActive->fetchAll();
    }
public function montaQuery(){
        if($this->status) {
    $query = "SELECT id, nome, endereco FROM tb_pessoas WHERE status = :status";
            }else{
    $query = "SELECT id, nome, endereco FROM tb_pessoas ";

        }

Olá Marcos,

Acredito que o que Wanderson quis dizer é separar em duas funções baseado na função (responsabilidade), assim criando uma função para listar todas as pessoas e uma para listar as pessoas pelo status:

public function listaPessoas() {
    $query = "SELECT id, nome, endereco FROM tb_pessoas";

    $connect = Connection::takeConnection();
    $listActive = $connect->prepare($query);
    $listActive->execute();
    return $listActive->fetchAll();
}

public function listaPessoasPorStatus() {
    $query = "SELECT id, nome, endereco FROM tb_pessoas WHERE status = :status";

    $connect = Connection::takeConnection();
    $listActive = $connect->prepare($query);
    $listActive->bindValue(':status', $this->status);
    $listActive->execute();
    return $listActive->fetchAll();
}

No caso anterior quando você vê listaPessoas() no seu código você não sabe facilmente se está filtrando pelo status ou não, separando como no exemplo acima fica mais claro para você mesmo quando estiver lendo o código.

Eu não sei como está a parte anterior do seu código, mas recomendo também passar o status apenas diretamente na função: listaPessoasPorStatus($status)

para por em pratica o que estou aprendendo nos cursos estou programando um CMS de um blog... essas linhas que passei são só um exemplo fictício pra ficar mais resumido, mas estou fazendo algo assim:

class Pessoa{
private id;
private nome;
private endereco;
private status;

public function __construct($id, $nome, $endereco, $status){

$this->id = $id;
$this->nome = $nome;
$this->endereco = $endereco;
$this->status = $status;
}
public function listaPessoasPorStatus() {
    $query = "SELECT id, nome, endereco FROM tb_pessoas WHERE status = :status";

    $connect = Connection::takeConnection();
    $listActive = $connect->prepare($query);
    $listActive->bindValue(':status', $this->status);
    $listActive->execute();
    return $listActive->fetchAll();
}


}
solução!

Ah entendi, então minha recomendação é essa mesma, separar em duas funções, uma para listar todas as pessoas e uma para listar as pessoas pelo status:

class Pessoa
{
    private id;
    private nome;
    private endereco;
    private status;

    public function __construct($id, $nome, $endereco, $status)
    {
        $this->id = $id;
        $this->nome = $nome;
        $this->endereco = $endereco;
        $this->status = $status;
    }

    public function listaPessoas()
    {
        $query = "SELECT id, nome, endereco FROM tb_pessoas";

        $connect = Connection::takeConnection();
        $listActive = $connect->prepare($query);
        $listActive->execute();

        return $listActive->fetchAll();
    }

    public function listaPessoasPorStatus($status)
    {
        $query = "SELECT id, nome, endereco FROM tb_pessoas WHERE status = :status";

        $connect = Connection::takeConnection();
        $listActive = $connect->prepare($query);
        $listActive->bindValue(':status', $status);
        $listActive->execute();

        return $listActive->fetchAll();
    }

}

Note que o status está sendo passado diretamente na função listaPessoasPorStatus($status) nesse meu exemplo.

Talvez seja bom também permitir criação de uma Pessoa sem precisar passar os parâmetros, deixando o construct assim: __construct($id = null, $nome = null, $endereco = null, $status = null), assim facilita se você precisar em algum momento fazer apenas a listagem:

$pessoa = new Pessoa();
$status = 'ok';

$pessoas = $pessoa->listaPessoas();
$pessoas_status_ok = $pessoa->listaPessoasPorStatus($status);

Outra dica importante é a organização do código, seguir uma indentação padrão, isso também facilita muito para o programador ler e interpretar o seu próprio código.

E parabéns pela iniciativa de fazer algo para treinar o que aprendeu, isso faz muita diferença.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software