Deletar dados em um banco de dados cheio de chaves estrangeiras pode ser uma grande dor de cabeça, alguns programadores bloqueiam esse tipo de ação fazendo com que o sistema muitas vezes fique cheio de lixo, e outros fazem a maneira correta de criar uma flag informando se aquele dado foi deletado ou não.
Pensando em facilitar mais ainda, o Laravel possui uma funcionalidade no Eloquent que já faz esse trabalho.
Para que o laravel trabalhe com remoção segura de dados, vamos adicionar um campo de data na tabela, esse campo vai informar o momento que aquele dado foi deletado, e o eloquent vai retornar apenas as informações que precisamos quando usamos os seus métodos.
Para adicionar esse campo, na nossa migration usamos o comando:
$table->softDeletes();
Esse comando deve adicionar na tabela o campo “deleted_at” do tipo timestamp.
Agora, tudo que temos que fazer é ir no Model dessa tabela e adicionar a trait SoftDeletes;
// Namespace: Illuminate\Database\Eloquent\SoftDeletes; use SoftDeletes;
Pronto! Agora sempre que usarmos o método “delete()” do Eloquent para deletar nossos registros, o laravel vai marcar esses dados com a data de remoção, e quando usarmos métodos de busca como o find(), get(), all() e outros, ele não deve retornar os dados marcados como removidos.
Se quisermos visualizar dados que foram removidos temos que adicionar o método “withTrashed()” ou “onlyTrashed()”
// Se a linha com id 1 for uma linha deletada, ele não retorna nada $linha = Linha::find(1); // Retorna o registro com ID 1 mesmo que ele tenha sido deletado antes $linha = Linha::withTrashed()->find(1); // Retorna o registro com ID 1 apenas se ele tiver sido deletado antes $linha = Linha::onlyTrashed()->find(1); // Para retornar o campo deletado, usamos o método restore $linha->restore();
Mais informações:
https://laravel.com/docs/5.4/eloquent#soft-deleting