Belajar Laravel 10 : A simple guide CRUD app - Menghapus Data

Assalamualaikum Warahmatullahi Wabarakatuh, Pada artikel ini adalah lanjutan dari artikel sebelumnya. Jadi silahkan simak secara runtut untuk dapat lebih mendalami tentang membuat crud sederhana menggunakan laravel 10. Pada sesi kali ini saya akan membahas cara menghapus data dari database menggunakan Laravel 10 dengan Ajax JQuery.

Silahkan lakukan secara berurutan sesuai artikel ini ya

 

Routes

Langkah pertama kita mengubah routes terlebih dahulu. Karena pengaksesan awal dari sebuah aplikasi website yang pertama dijalankan adalah membaca routes. Jika client ingin mengakses url tertentu, maka sistem akan membaca melalui rotes terlebih dahulu apakah url/route tesebut tersedia atau nggak atau methodnya diperbolehkan apa tidak.

Silahkan salin kode dibawah ini

Route::delete('{id}/hapus',[ BukuController::class, "hapusData" ])->name('hapusData');

Kali ini kita hanya menggunakan route delete, yang dimana hanya bisa diakses oleh method http delete. Jadi tanpa perlu membuat view/tampilan lain.

Kode diatas kita masih tetap menggunakan BukuController sebagai controllernya, lalu akan mengeksekusi function hapusData untuk proses penghapusan data pada database.

 

Ubah Controller

Kita ubah terlebih dahulu pada function dataTables. Karena didalam kode tersebut terdapat button untuk menghapus data, kita harus memodifikasi sesuai yang kita butuhkan. Silahkan ubah pada function dataTable seluruhnya menggunakan kode dibawah ini.

public function dataTable(Request $request)
    {
        $totalFilteredRecord = $totalDataRecord = $draw_val = "";
        $columns_list = array(
            0 =>'judul_buku',
            1 =>'tahun_terbit',
            2=> 'stok_buku',
            3=> 'gambar_buku',
            4=> 'id',
        );

        $totalDataRecord = Buku::count();

        $totalFilteredRecord = $totalDataRecord;

        $limit_val = $request->input('length');
        $start_val = $request->input('start');
        $order_val = $columns_list[$request->input('order.0.column')];
        $dir_val = $request->input('order.0.dir');

        if(empty($request->input('search.value')))
        {
            $buku_data = Buku::offset($start_val)
            ->limit($limit_val)
            ->orderBy($order_val,$dir_val)
            ->get();
        } else {
            $search_text = $request->input('search.value');

            $buku_data =  Buku::where('id','LIKE',"%{$search_text}%")
            ->orWhere('judul_buku', 'LIKE',"%{$search_text}%")
            ->offset($start_val)
            ->limit($limit_val)
            ->orderBy($order_val,$dir_val)
            ->get();

            $totalFilteredRecord = Buku::where('id','LIKE',"%{$search_text}%")
            ->orWhere('judul_buku', 'LIKE',"%{$search_text}%")
            ->count();
        }

        $data_val = array();
        if(!empty($buku_data))
        {
            foreach ($buku_data as $buku_val)
            {
                $url = route('ubahData',['id' => $buku_val->id]);
                $urlHapus = route('hapusData',$buku_val->id); // kode baru
                $bukunestedData['judul_buku'] = $buku_val->judul_buku;
                $bukunestedData['tahun_terbit'] = $buku_val->tahun_terbit;
                $bukunestedData['stok_buku'] = $buku_val->stok_buku;
                $bukunestedData['gambar_buku'] = "<img src='$buku_val->gambar_buku' class='img-thumbnail' width='200px'>";
                $bukunestedData['options'] = "<a href='$url'><i class='fas fa-edit fa-lg'></i></a> <a style='border: none; background-color:transparent;' class='hapusData' data-id='$buku_val->id' data-url='$urlHapus'><i class='fas fa-trash fa-lg text-danger'></i></a>"; // kode baru
                $data_val[] = $bukunestedData;
            }
        }
        $draw_val = $request->input('draw');
        $get_json_data = array(
        "draw"            => intval($draw_val),
        "recordsTotal"    => intval($totalDataRecord),
        "recordsFiltered" => intval($totalFilteredRecord),
        "data"            => $data_val
        );

        echo json_encode($get_json_data);
    }

 

untuk mengetahui perubahannya dimana, silahkan lihat pada comment // kode baru .

Setelah itu buka app/Http/Controllers/BukuController.php, silahkan tambahkan kode dibawah ini didalam class BukuControllers, pastikan method hapusData harus ada ya, karena pada routes kita mendefinisikan method yang kita panggil ialah method hapusData. 

public function hapusData($id)
    {
        $buku = Buku::findOrFail($id);
        if ($buku->gambar_buku && file_exists(public_path().$buku->gambar_buku)) {
            // hapus gambar
            unlink(public_path().$buku->gambar_buku);
        }
        // hapus data
        $buku->delete($id);
        return response()->json([
            'msg' => 'Data yang dipilih telah dihapus'
        ]);
    }

Penjelasan:

Pada function hapusData terdapat 1 params, yaitu variable id sebagai menerima data id dari url.

Setelah itu kita cek apakah dengan id tersebut terdapat data serupa apa nggak. Jika terdapat data yang sama maka akan mengambil data tersebut lalu disimpan ke dalam varaiable buku. Jika tidak terdapat data, maka akan langsung http 404 yang berarti data tersebut tidak ada.

if ($buku->gambar_buku && file_exists(public_path().$buku->gambar_buku)) {
            // hapus gambar
            unlink(public_path().$buku->gambar_buku);
        }

Jika gambar_buku valuenya tidak kosong dan terdapat file yang serupa didalam alamat gambar tersebut, maka akan terjadi proses penghapusan file.

Setelah proses penghapusan file lama selesai, sistem akan melanjutkan ke penghapusan data pada database berdasarkan id yang akan ditunjukkan pada kode dibawah;

// hapus data
$buku->delete($id);

Terakhir, akan membuat response berupa json yang berisi pesan data berhasil dihapus.

return response()->json([
            'msg' => 'Data yang dipilih telah dihapus'
        ]);

 

Layouting

Langkah terakhir kita layouting blade. Silahkan buka file pada folder resources/views/crudapp/index.blade.php,  silahkan ubah kode lama menggunakan kode baru seperti dibawah ini;

<html>
    <head>
        <title>Membuat CRUD sederhana menggunakan Laravel 9</title>
        <link
            rel="stylesheet"
            href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"
            integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
            crossorigin="anonymous">
        <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
    
        <script
            src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"
            integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6"
            crossorigin="anonymous"></script>
        <link
            rel="stylesheet"
            type="text/css"
            href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css">

        <!-- Font Awesome JS -->
        <script
            defer="defer"
            src="https://use.fontawesome.com/releases/v5.0.13/js/solid.js"
            integrity="sha384-tzzSw1/Vo+0N5UhStP3bvwWPq+uvzCMfrN1fEFe+xBmv1C/AtVX5K0uZtmcHitFZ"
            crossorigin="anonymous"></script>
        <script
            defer="defer"
            src="https://use.fontawesome.com/releases/v5.0.13/js/fontawesome.js"
            integrity="sha384-6OIrr52G08NpOFSZdxxz1xdNSndlD4vdcf/q2myIUVO0VsqaGHJsB0RaBE01VTOY"
            crossorigin="anonymous"></script>
        <script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script>

    </head>
    <body>
        <center>
            <h1>Membuat CRUD sederhana menggunakan Laravel 9</h1>
            <h3>Afrizal's Blog</h3>
        </center>
        <br/>
        <br/>
        <div class="container">
            <a class="btn btn-primary" href="{{ route('tambahData') }}">Tambah data</a>

            <table
                id="crudapp"
                class="table table-striped table-bordered"
                style="width:100%">
                <thead>
                    <tr>
                        <th>Judul Buku</th>
                        <th>Tahun Terbit</th>
                        <th>Stok Buku</th>
                        <th>Gambar Buku</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>

        </div>

        <script
            src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
            integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
            crossorigin="anonymous"></script>
        <script
            type="text/javascript"
            src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
        <script
            type="text/javascript"
            src="https://cdn.datatables.net/1.10.20/js/dataTables.bootstrap4.min.js"></script>
        <script>
            $(document).ready(function () {
                // tabel data
                $('#crudapp').DataTable({
                    "serverSide": true,
                    "processing": true,
                    "ajax": {
                        "url": "{{ route('dataTable') }}",
                        "dataType": "json",
                        "type": "POST",
                        "data": {
                            _token: "{{csrf_token()}}"
                        }
                    },
                    "columns": [
                        {
                            "data": "judul_buku"
                        }, {
                            "data": "tahun_terbit"
                        }, {
                            "data": "stok_buku"
                        }, {
                            "data": "gambar_buku"
                        }, {
                            "data": "options"
                        }
                    ],
                    "language": {
                        "decimal": "",
                        "emptyTable": "Tak ada data yang tersedia pada tabel ini",
                        "info": "Menampilkan _START_ hingga _END_ dari _TOTAL_ entri",
                        "infoEmpty": "Menampilkan 0 hingga 0 dari 0 entri",
                        "infoFiltered": "(difilter dari _MAX_ total entri)",
                        "infoPostFix": "",
                        "thousands": ",",
                        "lengthMenu": "Tampilkan _MENU_ entri",
                        "loadingRecords": "Loading...",
                        "processing": "Sedang Mengambil Data...",
                        "search": "Pencarian:",
                        "zeroRecords": "Tidak ada data yang cocok ditemukan",
                        "paginate": {
                            "first": "Pertama",
                            "last": "Terakhir",
                            "next": "Selanjutnya",
                            "previous": "Sebelumnya"
                        },
                        "aria": {
                            "sortAscending": ": aktifkan untuk mengurutkan kolom ascending",
                            "sortDescending": ": aktifkan untuk mengurutkan kolom descending"
                        }
                    }

                });

                // hapus data
                $('#crudapp').on('click', '.hapusData', function () {
                    var id = $(this).data("id");
                    var url = $(this).data("url");
                    Swal
                        .fire({
                            title: 'Apa kamu yakin?',
                            text: "Kamu tidak akan dapat mengembalikan ini!",
                            icon: 'warning',
                            showCancelButton: true,
                            confirmButtonColor: '#3085d6',
                            cancelButtonColor: '#d33',
                            confirmButtonText: 'Ya, hapus!',
                            cancelButtonText: 'Batal'
                        })
                        .then((result) => {
                            if (result.isConfirmed) {
                                // console.log();
                                $.ajax({
                                    url: url,
                                    type: 'DELETE',
                                    data: {
                                        "id": id,
                                        "_token": "{{csrf_token()}}"
                                    },
                                    success: function (response) {
                                        // console.log();
                                        Swal.fire('Terhapus!', response.msg, 'success');
                                        $('#crudapp').DataTable().ajax.reload();
                                    }
                                });
                            }
                        })
                });
            });
        </script>
        {{-- <script>
            $(document).ready(function () {
                $('#example').DataTable();
            });
        </script> --}}
    </body>
</html>

Penjelasan:

Silahkan fokus pada kode dibawah ini yang merupakan proses penghapusan data melalui ajax JQuery

// hapus data
                $('#crudapp').on('click', '.hapusData', function () {
                    var id = $(this).data("id");
                    var url = $(this).data("url");
                    Swal
                        .fire({
                            title: 'Apa kamu yakin?',
                            text: "Kamu tidak akan dapat mengembalikan ini!",
                            icon: 'warning',
                            showCancelButton: true,
                            confirmButtonColor: '#3085d6',
                            cancelButtonColor: '#d33',
                            confirmButtonText: 'Ya, hapus!',
                            cancelButtonText: 'Batal'
                        })
                        .then((result) => {
                            if (result.isConfirmed) {
                                $.ajax({
                                    url: url,
                                    type: 'DELETE',
                                    data: {
                                        "id": id,
                                        "_token": "{{csrf_token()}}"
                                    },
                                    success: function (response) {
                                        Swal.fire('Terhapus!', response.msg, 'success');
                                        $('#crudapp').DataTable().ajax.reload();
                                    }
                                });
                            }
                        })
                });

pada kode diatas jika kita menekan tombol icon sampah, maka akan menampilkan box dari sweetalert untuk konfimasi penghapusan data.

Untuk proses pertama kita mendapatkan data id dan url yang didapatkan dari kode html ini

data-id='$buku_val->id' data-url='$urlHapus'

setelah itu akan muncul box dari sweetalert untuk konfimasi penghapusan data.

Jika kalian menekan tombol `ya hapus!`, maka akan menjalankan proses ajax untuk menghapus data

if (result.isConfirmed) {
                                $.ajax({
                                    url: url,
                                    type: 'DELETE',
                                    data: {
                                        "id": id,
                                        "_token": "{{csrf_token()}}"
                                    },
                                    success: function (response) {
                                        Swal.fire('Terhapus!', response.msg, 'success');
                                        $('#crudapp').DataTable().ajax.reload();
                                    }
                                });
                            }

url kita isikan pada variable url yang didapatkan dari data-url tadi.

type kita pilih DELETE karena kita hanya membutuhkan proses penghapusan data.

data ini berisikan id data pada database yang didapatkan dari data-id tadi dan _token berisikan csrf token untuk membuktikan bahwa request ini benar dari laravel itu sendiri bukan dari request luar

 

jika sukses terhapus maka akan menampilkan box dari sweetalert yang menyatakan bahwa data telah terhapus. Selain itu data pada dataTable akan mereload secara otomatis tanpa refresh halaman.

 success: function (response) {
                                        Swal.fire('Terhapus!', response.msg, 'success');
                                        $('#crudapp').DataTable().ajax.reload();
                                    }

 

Jalankan Server

Akhir dari sesi ini, pastinya kalian harus cobain dong.

Jalankan server local kalian, bisa menggunakan perintah dibawah ini

php artisan serve

maupun jika menggunakan laragon atau apapun. setelah itu silahkan buka melalui browser lalu akses ke url domain-mu/

 

Hasil Percobaan

Silahkan lihat video ini

 

Oke sampai sini kita telah berhasil melakukan hapus data dengan Ajax JQuery dengan framework Laravel 9.

Wassalamualaikum Warahmatullahi Wabarakatuh.

 

File project bisa di unduh disini.

Baca sesi lainnya:

Belajar Laravel 10 : A simple guide CRUD app - Menambah Data

Belajar Laravel 10 : A simple guide CRUD app - Menampilkan Data

Belajar Laravel 10 : A simple guide CRUD app - Mengubah Data

Belajar Laravel 10 : A simple guide CRUD app - Menghapus Data

Apabila artikel ini membantu kamu, dan jika kamu memiliki sedikit rezeki, mohon dukungannya dalam bentuk segelas kopi melalui URL dibawah ini:

Last Updated: Sabtu, 27 Desember 2025 20:08 GMT+7

Comments