Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Aprenda como Utilizar o Recurso de Soft Deleting do Laravel

Aprenda como Utilizando o Recurso de Soft Deleting do Laravel

Outro recurso interessante do Laravel e que se mostra muito útil em diversos cenários é o Soft Deleting, este recurso permite “deletar” o registro sem excluir.

Como assim?

É possível criar um tabela com uma coluna “deleted_at”, essa coluna é do tipo date.

O Eloquent do Laravel por default (padrão) seleciona apenas os registros que não tem o campo “deleted_at” preenchidos.

Acontece o seguinte, quando está utilizando o recurso de Soft Deleting ao deletar o registro o mesmo não é apagado da tabela, apenas o campo deleted_at é preenchido com as informações de data. E quando consulta o registro, por default só retorna os registros com a coluna deleted_at está igual a null, ou seja, registros que não foram “deletados”.

Isso é interessante quando se tem informações valiosas no banco de dados, porque não é interessante neste caso que estes registros sejam apagados, como por exemplo, registros de usuários. Não é interessante excluir definitivamente um registro de usuário no sistema.

Para criar a coluna deleted_at na tabela, no arquivo de migration basta adicionar isso:

Schema::table('posts', function ($table) {
    $table->softDeletes();
});

O $table->softDeletes(); vai criar a coluna deleted_at

 
 

Utilizando o Recurso de Soft Deleting:

Para utilizar é muito simples, basta utilizar a Trait SoftDeletes no Model correspondente, apenas isso. Veja um exemplo prático:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;

    /**
     * Opcional, informar a coluna deleted_at como um Mutator de data
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

Agora ao selecionar os registros utilizando o Model (Eloquent) só vai trazer os registros que não foram apagados, ou seja, os registros que a coluna deleted_at é null, faça o teste:

#controller
public function index(Post $post)
{
	$posts = $post->get();

	return view('path.name-view', compact('posts'));
}

Para ver a query final, faça isso e irá notar que tem um where adicional em deleted_at, verificando se é diferente a null:

$posts = $post->toSql();
dd($posts);

Por default não vai trazer os registros deletados, mas, é possível forçar isso, de forma que não traga estes registros nem mesmo em relacionamento de tabelas, veja os exemplos:

// Exibindo os posts que não foram deletados do usuário logado
$posts = $post->where('user_id', auth()->user()->id)->withTrashed()->get();

// Registros que não foram deletados, mesmo com um relacionamento:
$posts = $post->comments()->withTrashed()->get();

 
 

Como exibir apenas os registros “deletados” com Soft Deleted?

É bem simples fazer isso, veja com o exemplo prático:

public function onlyTrashed(Post $post)
{
	$postsTrashed = $post->onlyTrashed()->get();

	return view('path.name-view', compact('postsTrashed'));
}

 
 

Restaurando um Registro deletado com Soft Deleted:

Note através do exemplo prático, como é simples fazer isso:

public function restore(Post $post, $id)
{
	// Recupera o post pelo ID
	$post = $post->find($id);

	// Restaura:
	$post->restore();

	// Também é possível fazer assim, em uma única linha:
	// $post = $post->find($id)->restore();
}

Outro método de restaurar um ou mais registros:

$post->withTrashed()
        ->where('user_id', auth()->user()->id)
        ->restore();

 
 

Como remover o registro permanentemente?

Em alguns casos pode que seja necessário remover definitivamente o registro, não só de maneira suave como vimos, mas sim, remover o registro do banco de dados definitivamente. Isso também é possível, veja o exemplo prático:

public function forceDelete(Post $post, $id)
{
	// Recupera o post pelo ID
	$post = $post->find($id);

	// Deleta definitivamente:
	$post->forceDelete();

	// Também é possível fazer assim, em uma única linha:
	// $post = $post->find($id)->forceDelete();
}

Este recurso de Soft Deleted é muito útil e simples, e em diferentes cenários certamente será necessário utilizar. Portanto espero que este tutorial tenha sido útil, e qualquer dúvida, deixa aquele comentário! 🙂

 

Abraços []’s

 
 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.