Você sabe o que é "softdelete"? Parte 2
Tags: beginners, laravel, php, softdelete
Published: 2022-06-28 16:09:03

Na [primeira parte](https://dev.to/marciopolicarpo/voce-sabe-o-que-e-softdelete-parte-1-290p) deste artigo, criamos o projeto, os métodos para listar registros e as respectivas rotas.

Nesta segunda parte, vamos implementar os métodos para deletar, restaurar e consultar modelos deletados.

---

## Deletando registros

O primeiro passo é editar a controller e incluindo o método para deleção de registros.

```php
public function deleteInvoiceById($id)
{
	$invoice = Invoice::find($id);

	if ($invoice) {
		$invoice->delete();
		return response()->json(['message' => 'Invoice '.$id.' successfully deleted']);
	} else {
		return response(['message' => 'Invoice not found'], 404);
	}
}

```

Explicando o código, primeiro verificamos se o registro existe e, se existir procedemos à deleção retornando uma mensagem personalizada.

Se não existir informamos que o registro não foi encontrado.

Em seguida adicionamos uma nova rota no arquivo '\route\api.php' para acessar o método criado na controller.

```php
Route::delete('/{id}/delete', 'deleteInvoiceById');
```

Agora vamos testar a aplicação fazendo uma requisição para rota que deleta o registro passado como parâmetro.

Se tudo estiver certo, veremos uma mensagem semelhante à esta logo abaixo.

![Request to delete invoice by id](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rdommdq4ub20xy7p9fpl.jpg)

Acessando novamente a rota que traz todos os registros veremos algo parecido com isto:

![Request to get all invoices](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nkt0tocmu9pts43umntp.jpg)

E acessando a rota para trazer um registro específico teremos o seguinte retorno:


![Request to get invoice by id](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8pd0inwxd3lcp65qp19.jpg)

---

## Restaurando registros deletados

Continuando com o projeto iremos implementar agora um método para restaurar registros deletados...

```php
public function restoreInvoiceById($id)
{
	$invoice = Invoice::onlyTrashed()->find($id);

	if ($invoice) {
		$invoice->restore();
		return response()->json(['message' => 'Invoice '.$id.' successfully restored']);
	} else {
		return response(['message' => 'Invoice not found'], 404);
	}
}

```

...e sua respectiva rota.

```php
Route::put('/{id}/restore', 'restoreInvoiceById');

```
Perceba a utilização do método `onlyTrashed()`cujo objetivo é garantir que apenas registros deletados possam ser encontrados.

Agora vamos testar a restauração do registro deletado.

![Request to restore deleted invoice](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pcgb70nr3hhmbe9oznaw.jpg)

Consultando todos os registros...

![Request to get all invoices](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a41ldz90l7vgbxnc53pg.jpg)

...e consultando o registro pelo id temos:

![Request to get invoice by id](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63ybbgeell8qnzow7886.jpg)

---

## Listando registros deletados

Para concluir a segunda parte deste artigo vamos criar o método que retorna um registro deletado pelo seu id...

```php
public function getTrashedInvoiceById($id)
{
	$invoice = Invoice::onlyTrashed()->find($id);
	
		if ($invoice) {
			return $invoice;
		} else {
			return response()->json(['message' => 'Invoice not found'], 401);
		}
}

```

...e sua respectiva rota:

```php
Route::get('/{id}/trashed', 'getTrashedInvoiceById');

```

Para testar este método acesse a rota que deleta registros qualquer id.

Logo após a deleção do registro basta acessar a rota que mostra registros deletados para obter o resultado abaixo.


![Request to get invoice delete](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bdz84vlixyd5jc9u9xq5.jpg)

Note que a propriedade "deleted_at" mostra a data e hora da exclusão desse registro.

---

Na [terceira e última parte](https://dev.to/marciopolicarpo/voce-sabe-o-que-e-softdelete-parte-3-1lp9) deste artigo vamos desenvolver o método que fará a exclusão definitiva dos modelos.

Até breve.