Sep 30 2008

Setar flag no lugar de excluir registro do banco com CakePHP

Category: CakePHP,PHPvbmendes @ 19:59

Uma boa prática de programação é setar uma flag indicando que um registro foi excluido, e não simplesmente excluir o registro do banco. Por exemplo, se eu tenho um produto, que está relacionado em vários pedidos, e eu simplesmente excluo o produto, todos os pedidos que referenciam ele serão inconsistentes. Se em troca de excluir o registro do produto, eu simplesmente setar uma flag no registro indicando que ele foi excluído, eu não perderei mais essa consistência. Para excluir o produto de id 5, seria algo como:

mysql_query("UPDATE produtos SET deleted = true WHERE id = 5");

E para listar os produtos, poderia ser algo como:

mysql_query("SELECT * FROM produtos WHERE NOT deleted;");

Percebam que para transferir isso para o CakePHP, basta alterar dois métodos, o index, adicionando a condição, e o delete, substituindo o $this->Produto->del() por um save. Mas o Mariano Iglesias do Cake Syrup desenvolveu um behavior que nos economiza muito trabalho. É o SoftDeletable. Com ele, a tarefa se resume a uma simples configuração no model no qual se deseja aplicar o uso da flag.

var $actsAs = array('SoftDeletable');

Para isso, basta criar o campo deleted na sua tabela e adicionar o arquivo do behavior, disponível no site citado, na pasta de behaviors do seu projeto.

O único problema que eu encontrei nesse behavior é que ao chamar a função $this->Model->del($id), o beforeDelete do behavior é acionado, atualizando o campo da flag deleted para true e retornando false, o que impede que o registro seja realmente excluído do banco. Com isso a tentativa de salvar retorna falso, indicando erroneamente que não obteve sucesso.

Tags: ,

2 Responses to “Setar flag no lugar de excluir registro do banco com CakePHP”

  1. Marcelo Sabadini says:

    Mais uma ótima dica!

    Ja faz um tempo que venho trabalhando desta forma, e trabalhando desta forma é possível guardar o usuário que deletou o registro.. só pra ter um controle mesmo. Já peguei um usuário mentiroso assim hahahah Ele falou q não tinha apagado um registro mas esta com o ID dele.

  2. Vinicius Mendes says:

    Eu estou pensando em um sistema de registro de logs utilizando utilizando um behavior que vi no paste do Cake. Aí daria pra saber qual usuário deletou o que. Prefiro fazer essa separação pra ficar mais organizado.