PHP Data Object (PDO) de maneira Produtiva: construindo uma classe CRUD — Parte 2

Sérgio Danilo Jr.
5 min readJan 16, 2021

--

Imagem extraída de https://github.com/sergiodanilojr/crud
Imagem extraída de https://github.com/sergiodanilojr/crud

Na primeira parte dessa série de publicações vimos como montar uma classe de conexão com o banco de dados bem versátil, à qual você consegue manipular todas as opções através de uma folha de configuração inicializada pelo Gerenciador de Dependências do PHP, o Composer, que disponibiliza globalmente o que ali foi definido.

Nesta publicação aprenderemos como componentizar a rotina de CRUD, que é o acrônimo de create, read, update e delete, para persistir, ler e filtrar, além de destruir dados do banco de maneira versátil.

Construindo a Classe CRUD, para trazer dinamismo para aplicação.

Cada método desta classe, como mostra o exemplo abaixo, faz o chamamento da classe que construímos a priori, na publicação anterior, e realiza, caso haja conexão com o banco de dados, aquilo que se propõe.

A classe será composta pelas seguintes propriedades:

private $fail — Responsável por armazenar as exceções (\PDOException) do PDO;

private $query — Todas as ‘queries’ que são construídas em cada um dos métodos são armazenadas nesta propriedade;

private $params — Uma boa prática quando trabalhamos com o PDO é trabalhar com bind params, esta propriedade irá armazenar cada um desses parâmetros como uma string, para que sejam manipulados da maneira mais segura.

private static $table — Note que esta propriedade foi definida como estática, pois possibilitará o endereçamento de qual tabela presente no banco de dados sofrerá, naquele instante, a ação à qual um determinado método se destina.

Getters and Setters

Métodos de Obtenção (Getters)

public function getFail() — Retorna, quando existente, uma Exceção PDO;

public function getQuery() — Retorna a query que foi contruída naquele momento, para fim de consulta ou reaproveitamento;

Métodos de Configuração (setters)

public static function setTable(string $table) — Quando chamado, esse método retorna uma nova instância da classe CRUD, permitindo reconfigurar todos os comportamentos que se deseja de acordo à tabela aqui configurada no seu parâmetro.

public function setQuery(string $query) — Este método permitirá uma abordagem bem dinâmica com o PDO, portanto, há a possibilidade de criar queries à maneira que se desejar escrever, portanto, este método existe para garantir esse comportamento.

public function setParams($params) — Todas as vezes que se faz necessário ter parâmetros numa determinada consulta, escrita ou exclusão, este método é invocado. Seja internamente, nos métodos que serão explanados abaixo, ou por fora, para implementação qualquer utilizando esta classe.

Leitura de dados no Banco

Como é possível analisar o código abaixo, o método ‘fetch()’ se encarrega de preparar a query na Instância PDO e, caso encontre dados, retornará o objeto, para que o método ‘read()’, que veremos a seguir, se encarregue de parametrizar o retorno.

Método fetch()

Entendendo o Método read()

Quem fará toda a manipulação do método fetch() é o read(), como mostra o código abaixo. É ele quem se encarregará de manipular o retorno como um array contento vários objetos com a fetchClass definida no parâmetro ou um objeto onde o seu atributo $data vai estar recebendo o retorno do banco.

Observação: Por padrão a classe de retorno não seja definida do parâmetro, ele adotará uma instância \stdClass() para realizar o fetch();

Inserindo Dados no Banco

O bloco try/catch abaixo se encarrega de configurar as colunas e os valores advindos do array $data passados através do parâmetro do método create, onde a variável $columns corresponde às colunas e a variável $values (bind) aos seus respectivos valores.

$columns = implode(“, “, array_keys($data));

Busca cada chave do array e as monta como uma string separada por vírgula e espaço. Como mostrado abaixo:

$data = [ ‘fullname’ => ‘Ada Lovelace’, ‘birth’=> ‘1815–12–10’];

Portanto, a coluna seria montada assim:

Colunas: ‘fullname, birth’;

Sob a mesma lógica, os valores são montados com os devidos binds das colunas:

$values = “:” . implode(“, :”, array_keys($data));

Valores: ‘:fullname, :birth’;

Por último, após executar o método execute do PDO, envelopado por um método de filtro (também presente nesta classe), o retorno deste método, caso não hajam falhas na inserção de dados, é feita através do método ‘lastInsertId()’, para que retorne o ID (chave primária) desta última inserção no Banco de Dados.

Atualizando Dados no Banco

O método de atualização dispõe de dois parâmetros, um array que receberá os dados e os termos (afinal, pense no caos que seria executar uma atualização sem termos… Bom, é melhor nem imaginar) para que esta ação seja realizada com sucesso.

Nesta rotina, o tratamento que é feito no parâmetro $data se assemelha ao do create(), porém aqui faz-se necessário um laço de repetição através de um foreach, ao qual trazemos a chave do array $data para montar as colunas e a atribuirmos a um bind do mesmo nome.

Por final, o array que recebeu cada uma das strings montadas é unido com uma vírgula e um espaço, para ser inserido na query de atualização, como mostrado abaixo;

Excluindo Dados do Banco

O método de exclusão disponibiliza dois parâmetros o primeiro consiste nos termos ($terms) da exclusão, para que filtre o dado que será excluído e, até mesmo, proteja o seu banco de uma possível exclusão indesejada. Enquanto o segundo é opcional, pois se trata dos parâmetros para ser adicionado à query de exclusão, como exemplifcado abaixo.

Contando os dados Retornados.

Enquanto que a maioria dos métodos supramencionados montam as suas próprias queries, este método depende de uma consulta feita para se utilizar e instanciar o método rowCount() do PDO e então retornar a quantidade de registros encontrados. Vide código abaixo.

Métodos Auxiliares

Durante toda a execução de cada método público, sois método essenciais se fazem disponíveis internamente na classe CRUD para filtrar os dados e tratar dos parâmetros que são inseridos por meio de outros métodos, são eles:

private function parseParams($params) — Encarrega-se de fazer um parse nas strings, a fim de disponibilizá-las como variáveis dentro da propriedade $params da classe CRUD;

private function filter (array $data) — Este é o responsável por aplicar um filtro default em cada um dos índices do array $data recebido como parâmetro e instanciado nos métodos de escrita update() e create().

Por fim, vimos aqui como construir uma classe organizada para ser a responsável de executar um CRUD completo de maneira componentizada. Na próxima publicação desta mesma série nós veremos como utilizar essa classe para construir um query builder enxuto, porém versátil e útil.

Eis a nossa Classe CRUD toda montada.

Espero que você tenha gostado dessa forma de trabalhar, abstraindo o PDO, de maneira a facilitar a implementação em qualquer projeto que venha desenvolver aplicando PHP, além de ter margem para poder melhorar seus recursos e contruir componentes outros que necessitem dessa base.

Onde aprendi PHP: UpInside Treinamentos

Referência: PDO | PHP.net

--

--

Sérgio Danilo Jr.

Desenvolvedor FullStack PHP | Amante de Tecnologia e Livros. Soteropolitano. Viajando com código e levando tecnologia a outros lugares desse nosso Brasil