Laravel 12 CRUD (MySQL + JWT)
#13 Menambahkan Relasi User–Siswa (Opsional)
Saat ini, semua pengguna bisa melihat dan mengelola data siswa yang sama. Agar lebih personal dan aman, kita bisa menambahkan relasi sehingga setiap siswa hanya dimiliki oleh user yang membuatnya.
Ini akan melibatkan: menambahkan kolom
user_id pada tabel siswa, mendefinisikan relasi di model, dan menyesuaikan controller agar setiap operasi CRUD hanya berhubungan dengan siswa milik user yang sedang login. Yuk kita lakukan! 🚀
Langkah 1: Membuat Migration untuk Menambahkan user_id
1 Buka terminal di folder proyek siswaapi. Buat migration baru untuk menambahkan kolom user_id pada tabel siswa:
Perintah ini akan membuat file migration baru di database/migrations dengan nama seperti 2025_03_24_123456_add_user_id_to_siswa_table.php.
Langkah 2: Isi Migration dengan Kolom user_id
2 Buka file migration tersebut. Isi method up() untuk menambahkan kolom user_id sebagai foreign key yang merujuk ke tabel users:
Penjelasan:
$table->unsignedBigInteger('user_id')→ menambahkan kolom user_id (tipe integer).$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')→ membuat foreign key ke kolom id di tabel users, dan jika user dihapus, data siswa yang terkait ikut terhapus (cascade).after('id')→ opsional, menempatkan kolom setelah id.
users sudah ada sebelum menjalankan migration ini. Jika belum, jalankan php artisan migrate terlebih dahulu.
Langkah 3: Jalankan Migration
3 Jalankan migration untuk menambahkan kolom:
Jika berhasil, tabel siswa sekarang memiliki kolom user_id yang terhubung ke tabel users.
siswa, seharusnya ada kolom user_id dan foreign key.
🔗 Langkah 4: Menambahkan Relasi di Model
4 Buka model app/Models/Siswa.php. Tambahkan relasi belongsTo ke model User:
Juga tambahkan user_id ke dalam $fillable agar bisa diisi massal:
Buka juga model app/Models/User.php. Tambahkan relasi hasMany ke model Siswa:
Sekarang setiap user bisa memiliki banyak siswa, dan setiap siswa milik satu user.
Langkah 5: Menyesuaikan Controller – Menyimpan user_id Saat Create
5 Buka app/Http/Controllers/SiswaController.php. Saat menyimpan data siswa, kita perlu mengisi user_id dengan ID user yang sedang login. Ubah method store():
Langkah 6: Membatasi CRUD Hanya untuk Siswa Milik User yang Login
6 Agar setiap user hanya bisa melihat, mengedit, dan menghapus siswa miliknya sendiri, kita perlu menambahkan filter where('user_id', auth('api')->id()) pada setiap query. Ubah method di controller:
Method index() – hanya menampilkan siswa milik user yang login:
Method show() – cek kepemilikan sebelum menampilkan detail:
Method update() – pastikan siswa milik user yang login:
Method destroy() – juga dengan filter kepemilikan:
Langkah 7: Uji Coba Relasi dan Isolasi Data
7 Uji dengan Postman:
- Login sebagai user A (misal
siti@example.com), dapatkan token. - Tambahkan beberapa siswa baru.
- GET
/api/siswa→ hanya menampilkan siswa milik user A. - Login sebagai user B (misal
budi@example.com), dapatkan token baru. - GET
/api/siswa→ akan kosong (atau hanya siswa milik user B jika pernah ditambahkan). - Pastikan user A tidak bisa mengedit/menghapus siswa milik user B (akan mendapat 404).
Ringkasan Perubahan
- ✅ Migration: tambah kolom
user_idpada tabel siswa dengan foreign key ke users. - ✅ Model: tambah relasi
belongsTodi Siswa danhasManydi User. - ✅ Controller: saat store, isi
user_iddenganauth('api')->id(). - ✅ Controller: semua method CRUD difilter dengan
where('user_id', auth('api')->id()). - ✅ Uji coba isolasi data antar user.
📌 Catatan: Langkah ini opsional tetapi sangat disarankan untuk aplikasi multi-user. Jika kamu ingin melanjutkan ke #14 (Finishing), pastikan semua berjalan dengan baik.
(Link akan aktif saat artikel sebelumnya dan selanjutnya terbit)