Sep 30 2008
Setar flag no lugar de excluir registro do banco com CakePHP
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.
