#18-Laravel Soft Deletes

Pengertian Soft Deletes

Soft Deletes adalah fitur dari laravel untuk membuat penghapusan data sementara. kita bisa menghapus data pada table, tapi data tersebut tidak benar-benar langsung dihapus, masih tersimpan dalam table tapi tidak tampil lagi.

Saya analogikan, dengan fitur soft deletes ini, ibaratnya kita bisa memasukkan data ke tong sampah. seperti recycle bin misalnya jika di OS windows. nah, data yang sudah kita masukkan ke tong sampah tersebut bisa kita tampilkan kembali atau bisa juga kita hapus secara permanen.

Misal nya lagi, ibaratnya ada beberapa barang di atas meja teman-teman. teman-teman bisa membuang barang-barang tersebut ke tong sampah yang ada di dekat meja, nah pasti teman-teman masih bisa mengambil barang yang sudah dibuang tadi, dan diletakkan kembali ke atas meja. Atau mungkin teman-teman juga bisa membuang barang tersebut untuk selamanya dengan cara membakar barang tersebut.

Jika teman-teman pernah menggunakan CMS WordPress, saat teman-teman menghapus postingan artikel, maka data postingan tersebut tidak langsung dihapus, tapi akan masuk ke menu trash (sampah). kita masih bisa menampilkan kembali (restore) postingan yang sudah dihapus tersebut. dan kita juga bisa menghapus postingan tersebut secara permanen.

Nah, di laravel, kita tidak perlu susah-susah untuk membuat fitur semacam ini pada aplikasi kita. laravel sudah menyediakan fitur SoftDeletes yang bisa langsung kita gunakan.

Persiapan

Pada tutorial sebelumnya kita sudah membuat Eloquent CRUD untuk table employees dengan tampilan akhir sbb:

Module Employee

Sekarang kita akan menerapkan Soft Deletes pada module tsb.

Menambahkan fitur SoftDeletes pada Model app/Employee.php

<?php

namespace App;

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

class Employee extends Model
{
    //
    use SoftDeletes;
    protected $table='employees';
    
    protected $fillable = ['fullname','email','address'];
    protected $dates = ['deleted_at'];
}

Perhatikan baris berikut

use Illuminate\Database\Eloquent\SoftDeletes;

Karena kita akan menggunakan fitur SoftDeletes, maka kita harus memanggilnya terlebih dulu pada model. lalu memanggilnya dalam class

use SoftDeletes;

dan kemudian di dalam class, kita deklarasikan variabel protected $dates.

protected $dates = ['deleted_at'];

Menambahkan kolom delete_at type datetime pada Database.Table learning_laravel.employees sehingga menjadi seperti berikut:

Menyiapkan template untuk SoftDeletes

Perbarui employee.blade.php

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" type="text/css" href="{{ asset('/css/app.css') }}">
        <title>{{$title}}</title>
    </head>
    <body>
        <div class="container">
            <div class="card mt-5">
                <div class="card-header text-center">
                    {{$title}}
                </div>
                <div class="card-body">
                    <a href="/employee/create" class="btn btn-primary">Tambah Baru</a>
                     | <a href="/employee/trash">Tong Sampah <i class="fa fa-trash" aria-hidden="true"></i></a>
                    <br/>
                    <br/>
                    <p>Cari :</p>
                    <form class="form-inline" action="/employee/search" method="GET">
                        <label class="sr-only" for="inlineFormInputName2">Nama Lengkap</label>
                        <input name="search" type="text" class="form-control mb-2 mr-sm-2" id="inlineFormInputName2" placeholder="Nama Lengkap .." value="{{ old('search') }}">
                        <button type="submit" class="btn btn-primary mb-2">Submit</button>
                    </form>
                    <table class="table table-bordered table-hover table-striped">
                        <thead>
                            <tr>
                                <th>Nama</th>
                                <th>Email</th>
                                <th>Alamat</th>
                                <th width="175">Aksi</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach($data as $row)
                            <tr>
                                <td>{{ $row->fullname }}</td>
                                <td>{{ $row->email }}</td>
                                <td>{{ $row->address }}</td>
                                <td>
                                    <a href="/employee/edit/{{ $row->id }}" class="btn btn-warning">Ubah</a>
                                    <a href="/employee/delete/{{ $row->id }}" class="btn btn-danger">Hapus</a>
                                </td>
                            </tr>
                            @endforeach
                        </tbody>
                    </table>
                    <br/>
                    Halaman : {{ $data->currentPage() }} <br/>
                    Jumlah Data : {{ $data->total() }} <br/>
                    Data Per Halaman : {{ $data->perPage() }} <br/>
                
                
                    {{ $data->links() }}
                </div>
            </div>
        </div>
    </body>
</html>

Employee + Trash Link

Menyiapkan routes/web.php

Route::get('employee/trash', 'EmployeeController@trash');

Menambahkan function pada Controller EmployeeController.php

public function restore($id){
    $employee = Employee::onlyTrashed()->where('id',$id);
    $employee->restore();
    return redirect('/employee/trash');
}

Membuat employee_trash.blade.php

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" type="text/css" href="{{ asset('/css/app.css') }}">
        <title>{{$title}}</title>
    </head>
    <body>
        <div class="container">
            <div class="card mt-5">
                <div class="card-header text-center">
                    {{$title}}
                </div>
                <div class="card-body">
                    <a href="/employee" class="btn btn-primary">Kembali</a>
                    <br/>
                    <br/>
                    <a href="/employee/restore_all">Kembalikan Semua</a>|<a href="/employee/delete_permanen_all">Hapus Permanen Semua</a>
                    <table class="table table-bordered table-hover table-striped">
                        <thead>
                            <tr>
                                <th>Nama</th>
                                <th>Email</th>
                                <th>Alamat</th>
                                <th width="175">Aksi</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach($data as $row)
                            <tr>
                                <td>{{ $row->fullname }}</td>
                                <td>{{ $row->email }}</td>
                                <td>{{ $row->address }}</td>
                                <td>
                                    <a href="/employee/restore/{{ $row->id }}" class="btn btn-success btn-sm">Restore</a>
                                    <a href="/employee/delete_permanent/{{ $row->id }}" class="btn btn-danger btn-sm">Hapus Permanen</a>
                                </td>
                            </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </body>
</html>

Klik tombol Hapus di salah satu baris data

Baris data akan terhapus, lalu klik link Tong Sampah, maka data yg baru dihapus akan muncul di halaman Tempat Sampah

Kita melihat tombol/link2 baru pada tampilan tsb yang fungsinya akan dijelaskan kemudian. Sekarang kita buat Route untuk tombol/link2 tsb yaitu

  • Restore , mengembalikan data yang dipilih dari tempat sampah ke data Pegawai
  • Hapus Permanen, menghapus data yang dipilih dari tempat sampah secara tetap/permanen dan tidak dapat dikembalikan lagi
  • Kembalikan Semua, mengembalikan semua data dari tempat sampah ke data Pegawai
  • Hapus Semua, menghapus semua data dari tempat sampah secara tetap/permanen dan tidak dapat dikembalikan lagi

Membuat route untuk fungsi2 di atas, dengan menambahkan baris berikut pada file routes/web.php

Route::get('employee/restore/{id}', 'EmployeeController@restore');
Route::get('employee/restore_all', 'EmployeeController@restore_all');
Route::get('employee/delete_permanent/{id}', 'EmployeeController@delete_permanent');
Route::get('employee/delete_permanent_all', 'EmployeeController@delete_permanent_all');

Buat Controller masing2 link/tombol, tambahkan function2 berikut ke EmployeeController.php

public function restore($id){
    $employee = Employee::onlyTrashed()->where('id',$id);
    $employee->restore();
    return redirect('/employee/trash');
}
public function restore_all(){
        
    $employee = Employee::onlyTrashed();
    $employee->restore();

    return redirect('/employee/trash');
}
public function delete_permanen($id){
    $employee = Employee::onlyTrashed()->where('id',$id);
    $employee->forceDelete();

    return redirect('/employee/trash');
}
public function delete_permanen_all($id){
    $employee = Employee::onlyTrashed();
    $employee->forceDelete();

    return redirect('/employee/trash');
}

Coba jalankan masing-masing tombol/link2 di atas

Sumber:

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>