1

Saturday, July 3, 2021

Deleting Data

 

Delete Model Yang Memiliki Relasi

Saat ini kita memiliki table relation antara blog_posts dan comments, seperti dibawah ini


Jika kita menghapus comment lewat Comment Model, tidak akan terjadi masalah. Tapi apabila kita menghapus blog_posts yang memiliki comments, maka akan terjadi masalah Sekarang coba hapus salah satu blog_post yang memiliki comments, maka hasilnya menjadi menjadi error.


Error ini terjadi karena ada constraint FK blog_post_id di tabel comments.

Delete Related Table Menggunakan Laravel Model Event

Untuk meng-handle masalah tersebut kita akan menggunakan Laravel Model Event Buka file app/Models/BlogPost.php dan tambahkan code dibawah ini.


Sekarang coba hapus salah satu blog_post yang memiliki comments, maka hasilnya menjadi seperti dibawah ini.


Delete Related Table Menggunakan Database Cascading

Cara lain untuk meng-handle masalah tersebut adalah dengan menggunakan cascade pada database level. Buat migration baru

Buka file database/migrations/yyyy_mm_dd_time_add_cascade_delete_to_comments_tabl e.php dan ubah menjadi menjadi seperti ini.


Jalan migration


Buka file app/Models/BlogPost.php dan tambahkan code dibawah ini


Sekarang coba hapus salah satu blog_post yang memiliki comments, maka hasilnya menjadi seperti dibawah ini.


Model Soft Deleting

Pada real world applications kadang kita membutuhkan kehati-hatian dalam dalam melakukan delete data. Sebagai contoh di website berbasis Wordpress, ketika kita mendelete blog post, maka secara default blog post tersebut akan masuk ke Trash. Data tersebut masih ada di database dan bisa kita restore. Mekanisme delete seperti ini disebut dengan Soft Delete.

Implementasi Soft Delete pada Laravel cukup sederhana. Ketika mend-delete data, Laravel tidak mendelete nya dari database, tapi memberikan flag delete pada column delete_at. Apabila column delete_at ada isinya, maka itu tanda rows tersebut statusnya sudah deleted

Buat migration baru


Buka file database/migrations/yyyy_mm_dd_time_add_soft_delete_to_blog_posts_table.p hp dan ubah menjadi menjadi seperti ini.


Buka file app/Models/BlogPost.php dan tambahkan code dibawah ini.


Sekarang coba hapus salah satu atau beberapa blog_post, kemudian lihat di database nya, maka rows yang di delete pada column deleted_at akan terisis timestamps ketika delete.


Query Soft Deleted Rows

Silahkan masuk ke tinker


Karena kita sedang memastikan soft deleted rows, untuk sementera kita perlu menyederhanakanya hanya mereturn id column saja. Untuk implementasinya kita akan menggunakan method pluck().


Untuk me-return semua data (include soft deleted rows) kita bisa menggunakan method withTrashed(). Kita lihat id 4 saat ini muncul, sedangkan di query sebelumnya tidak muncul.


Untuk me-return data soft deleted rows saja, kita bisa menggunakan method onlyTrashed(). Kita lihat hanya id 4 yang saat ini muncul.


Untuk mengecek apakah row sudah deleted atau belum kita bisa menggunakan method trashed(). Sekarang kita coba query data yang belum di delete.

$post = BlogPost::find(id);

Kemudian kita check apakah sudah deleted atau belum dengan menggunakan method trashed(). Kalau return false, berarti data tersebut belum di delete, kalau return nya true, berarti data tersebut sudah di delete.

 $post->trashed();


Restore Soft Deleted Rows

Untuk me-restore soft deleted rows, kita akan menggunakan method restore(). Masuk ke tinker dan Cari salah satu BlogPost yang sudah di delete, kemudian di restore.

Cari BlogPost → $post = BlogPost::onlyTrashed()->get()->first();

Cek apakah trashed: → $post->trashed(); → harusnya true

Restore BlogPost → $post->restore();

Cek apakah trashed: → $post->trashed(); → harusnya false


Soft Deleted dan Restoring Relation Model

Saat ini kita baru implementasi soft delete pada model BlogPost. Sebagaimana yang kita tahu, BlogPost model memiliki relation ke Comment model. Oleh karena itu ketika kita delete BlogPost, maka kita juga harus delete Comment. Dan kita akan menggunakan soft delete.

Buat migration baru


buka file

database/migrations/ yyyy_mm_dd_time_add_soft_delete_to_comments_table.ph p dan ubah menjadi menjadi seperti ini


Jalan migration


Buka file app/Models/Comment.php dan tambahkan code dibawah ini.


Buka file app/Models/BlogPost.php dan tambahkan code dibawah ini.


Masuk ke tinker                

Cari satu BlogPost yang memiliki comments.

a. Cari BlogPost → $post = BlogPost::has('comments')->get()->first();

 b. Delete BlogPost → $post->delete();

c. Check apakah sudah deleted → $post->trashed();


Dalam kasus ini, id BlogPost nya adalah 7. Sekarang kita lihat data di table blog_posts dan dengan id = 7 dan data di table comments dengan blog_post_id = 7, column deleted_at nya sudah ada timestamp nya

Table blog_posts


Table comments


Sekarang kita coba restore BlogPost dengan id = 7


Sekarang kita lihat data di table blog_posts dan dengan id = 7 dan data di table comments dengan blog_post_id = 7, column deleted_at nya sudah jadi NULL

Table blog_posts


Table comments



No comments:

Post a Comment