MASIGNASUKAv102
7345699749361123385

Cara Membuat Fitur Softdelete Di Laravel

Cara Membuat Fitur Softdelete Di Laravel
Add Comments
20 February 2020

Softdelete Laravel - Di artikel kali ini saya akan menuliskan tentang cara membuat fitur softdelete dan delete permanen di laravel. Dalam percobaan kali ini saya akan membuat project laravel baru dengan nama softdelete lengkap dengan fitur Auth. Cara install project laravel dengan fitur auth bisa dilihat di artikel yang pernah saya buat sebelumnya.

Softdelete artinya, ketika dihapus data tidak langsung dihapus dari database, tetapi ditandai saja bahwa status dari data tersebut didelete atau dimasukkan ke dalam tong sampah. Status delete ini nanti akan dimasukkan ke field deleted_at yang akan saya buat nanti. OK, langsung saja saya akan membuka direktori project softdelete. Kemudian lanjut ke langkah-langkah berikut:

1. Buat database baru dengan nama softdelete

2. Buka file .env, pada DB_DATABASE sesuaikan dengan nama database yang baru dibuat (softdelete).


3. Buka file 2014_10_12_000000_create_users_table.php pada folder database/migration. Kemudian ubah semua kodenya menjadi seperti di bawah ini.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users'function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->integer('updated_by')->nullable();
            $table->integer('deleted_by')->nullable();
            $table->softDeletes();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Save, kemudian jalankan artisan "php artisan migrate"

4. Buat controller baru dengan nama UserController atau jalankan artisan "php artisan make:controller UserController"

5. Buka file UserController yang baru dibuat di point 5. Tambahkan function index seperti di bawah ini.

public function index(){

        $user = \App\User::paginate(10);
        return view('user.index',compact('user'));
    
    }

6. Buka web.php di folder routes/web.php, kemudian tambahkan route baru untuk mengakses data user. Route untuk menampilkan data user, seperti di bawah ini.

Route::resource('user''UserController');

7. Buat folder baru dengan nama user di resources/views. Kemudian tambahkan file index.blade.php di dalam folder user. Tambahkan kode di bawah ini.

@extends('layouts.app')

@section('content')

<div class="container">

    <div class="card">
        <div class="card-header">
          <h3 class="card-title">Data User</h3>

<div class="col-md-6">
 
            <ul class="nav nav-pills card-header-pills">
     
                <li class="nav-item">
     
                 <a class="nav-link" href="{{route('user.index')}}">Published</a>
     
                </li>
     
                <li class="nav-item">
     
                 <a class="nav-link active" href="{{route('user.trash')}}">Trash</a>
     
                </li>
     
            </ul>
     
        </div>
        </div>
        <!-- /.card-header -->
        <div class="card-body">
          <table id="example1" class="table table-bordered table-striped">
            <thead>
            <tr>
              <th>ID</th>
              <th>Nama</th>
              <th>Email</th>
              <th>Created_at</th>
              <th>Option</th>
            </tr>
            </thead>
            <tbody>

                @foreach ($user as $user)
                    
            <tr>
                <td>{{$user->id}}</td>
                <td>{{$user->name}}</td>
                <td>{{$user->email}}</td>
                <td>{{$user->created_at}}</td>
                <td>
                    Delete
                </td>
            </tr>

                @endforeach

          </table>
        </div>
        <!-- /.card-body -->
      </div>
</div>

@endsection

Nah, sekarang jika di arahkan ke route user maka tampilannya akan seperti di bawah ini.


Data-data di atas merupakan hasil dari register dengan fitur register yang disediakan laravel.

8. Tambahkan fitur delete user. Tambahkan kode di bawah ini di index.blade.php menggantikan nilai "delete".

 <form class="d-inline" action="{{route('user.destroy', [$user->id])}}"
method="POST" onsubmit="return confirm('Move category to trash?')">
 
     @csrf

     <input type="hidden" value="DELETE" name="_method">

     <input type="submit" class="btn btn-danger btn-sm" value="Trash">

 </form>

9. Buka Model User di App/User.php. Tambahkan

use Illuminate\Database\Eloquent\SoftDeletes;

dan

 use SoftDeletes;

10. Tambahkan function destroy di UserController. Tambahkan kode di bawah ini.

public function destroy($id){

        $user = \App\User::findOrFail($id);

        $user->delete();

        return redirect()->route('user.index')
->with('status','User successfully moves to trash');

    }

OK, sekarang fitur softdelete sudah bisa digunakan. Selanjutnya saya akan membuat view trash yang akan menampilkan data-data yang telah didelete(softdelete).

11. Buat file baru dengan nama trash.blade.php di dalam folder resources/views/user. Tambahkan kode di bawah ini

@extends('layouts.app')

@section('content')

<div class="container">

    <div class="card">
        <div class="card-header">
          <h3 class="card-title">Data User</h3>
          <div class="col-md-6">
 
            <ul class="nav nav-pills card-header-pills">
     
                <li class="nav-item">
     
                <a class="nav-link" href="{{route('user.index')}}">Published</a>
     
                </li>
     
                <li class="nav-item">
     
                <a class="nav-link active" href="{{route('user.trash')}}">Trash</a>
     
                </li>
     
            </ul>
     
        </div>
        </div>
        <!-- /.card-header -->
        <div class="card-body">
          <table id="example1" class="table table-bordered table-striped">
            <thead>
            <tr>
              <th>ID</th>
              <th>Nama</th>
              <th>Email</th>
              <th>Created_at</th>
              <th>Option</th>
            </tr>
            </thead>
            <tbody>

                @foreach ($deleted_user as $user)
                    
            <tr>
                <td>{{$user->id}}</td>
                <td>{{$user->name}}</td>
                <td>{{$user->email}}</td>
                <td>{{$user->created_at}}</td>
                <td>
                    Restore
                </td>
            </tr>

                @endforeach

          </table>
        </div>
        <!-- /.card-body -->
      </div>
</div>

@endsection

12. Kemudian tambahkan function baru dengan nama trash di UserController atau tambahkan kode di bawah ini.

public function trash(){

        $deleted_user = \App\User::onlyTrashed()->paginate(10);

        return view('users.trash', compact('deleted_user'));

    }

OK, sekarang saya sudah punya view baru untuk menampilkan data-data yang telah saya delete (softdelete).
Untuk tampilan, view trash sama saja dengan user/index hanya saja bedanya di trash menampilkan data-data yang telah didelete sebelumnya.

Nah, selanjutnya saya akan menambahkan opsi restore. Jadi data-data yang sudah saya delete (diarahkan ke trash) akan saya kembalikan lagi ke user.index.

13. Tambahkan opsi restore di view trash. Buka kembali trash.blade.php, kemudian masukkan kode di bawah ini menggantikan kata "restore" di trash.blade.php.

 <a href="{{route('user.restore', [$user->id])}}" class="btn btn-success">Restore</a>

14. Tambahkan function baru di UserController. Tambahkan kode di bawah ini.

 public function restore($id){

   $user = \App\User::withTrashed()->findOrFail($id);

   if ($user->trashed()) {
            
   $user->restore();
        
   }else{
            
   return redirect()->route('user.index')->with('status','User is not in trash');
   }

return redirect()->route('user.index')->with('status','User successfully restored');
    }

15. Kemudian tambahkan route untuk restore dengan kode di bawah ini.

Route::get('/user/{id}/restore''UserController@restore')->name('user.restore');

Tambahkan di atas kode Route::resources('user','UserController');

Nah sekarang, saya sudah bisa memindahkan data dari trash ke index lagi. Terus bagaimana caranya untuk menghapus data secara permanent ? OK sekarang saya akan membuat fitur delete permanent.

16. Tambahkan option delete permanent user pada trash.blade.php. Tambahkan kode di bawah ini di bawah kode point 13.

 <form class="d-inline" action="{{route('user.deletepermanent', [$user->id])}}"
method="POST" onsubmit="return confirm('Delete this User permanently?')">
 
  @csrf

  <input type="hidden" name="_method" value="DELETE"/>

  <input type="submit" class="btn btn-danger btn-sm" value="Delete"/>

 </form>

17. Kemudian buka kembali UserController dan tambahkan function baru dengan nama deletePermanent atau tambahkan kode di bawah ini.

public function deletePermanent($id){

        $user = \App\User::withTrashed()->findOrFail($id);

        if (!$user->trashed()) {
            
  return redirect()->route('user.index')
->with('status','Can not delete permanent active user');
        
        } else {
            
            $user->forceDelete();

            return redirect()->route('user.index')
->with('status','User permanently deleted');
        }
    }

18. Kemudian tambahkan juga route untuk delete permanent. Buka routes/web.php, dan tambahkan kode di bawah ini di bawah kode point 15.

Route::delete('/user/{user}/delete-permanent','UserController@deletePermanent')
->name('user.deletepermanent');

OK selesai sudah artikel yang saya tulis kali ini tentang cara membuat fitur softdelete di laravel. 






Hilmi Hidayat

"If something's important enough, you should try. Even if you - the probable outcome is failure." - Elon Musk