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