Laravel 12 CRUD (MySQL + JWT) #13: Menambahkan Relasi User–Siswa (Opsional)

Laravel 12 CRUD (MySQL + JWT) 
#13 Menambahkan Relasi User–Siswa (Opsional)

👥 Setiap siswa milik user • Kolom user_id • Relasi Eloquent
🔗 Opsional: Hubungkan setiap siswa dengan user yang membuatnya!
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:

php artisan make:migration add_user_id_to_siswa_table

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:

public function up(): void { Schema::table('siswa', function (Blueprint $table) { $table->unsignedBigInteger('user_id')->after('id'); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); } public function down(): void { Schema::table('siswa', function (Blueprint $table) { $table->dropForeign(['user_id']); $table->dropColumn('user_id'); }); }

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.
📌 Catatan: Pastikan tabel 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:

php artisan migrate

Jika berhasil, tabel siswa sekarang memiliki kolom user_id yang terhubung ke tabel users.

✅ Cek di phpMyAdmin: buka tabel 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:

public function user() { return $this->belongsTo(User::class); }

Juga tambahkan user_id ke dalam $fillable agar bisa diisi massal:

protected $fillable = [ 'nama', 'kelas', 'alamat', 'user_id', // tambahkan ini ];

Buka juga model app/Models/User.php. Tambahkan relasi hasMany ke model Siswa:

public function siswa() { return $this->hasMany(Siswa::class); }

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():

public function store(Request $request) { $request->validate([ 'nama' => 'required|string|max:255', 'kelas' => 'required|string|max:50', 'alamat' => 'required|string', ]); $siswa = Siswa::create([ 'nama' => $request->nama, 'kelas' => $request->kelas, 'alamat' => $request->alamat, 'user_id' => auth('api')->id(), // tambahkan ini ]); return response()->json([ 'success' => true, 'message' => 'Siswa berhasil ditambahkan', 'data' => $siswa ], 201); }

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:

public function index() { $siswa = Siswa::where('user_id', auth('api')->id())->get(); return response()->json([ 'success' => true, 'data' => $siswa ]); }

Method show() – cek kepemilikan sebelum menampilkan detail:

public function show($id) { $siswa = Siswa::where('user_id', auth('api')->id())->find($id); if (!$siswa) { return response()->json([ 'success' => false, 'message' => 'Siswa tidak ditemukan' ], 404); } return response()->json([ 'success' => true, 'data' => $siswa ]); }

Method update() – pastikan siswa milik user yang login:

public function update(Request $request, $id) { $siswa = Siswa::where('user_id', auth('api')->id())->find($id); if (!$siswa) { return response()->json([ 'success' => false, 'message' => 'Siswa tidak ditemukan' ], 404); } $request->validate([ 'nama' => 'sometimes|string|max:255', 'kelas' => 'sometimes|string|max:50', 'alamat' => 'sometimes|string', ]); $siswa->update($request->only(['nama', 'kelas', 'alamat'])); return response()->json([ 'success' => true, 'message' => 'Siswa berhasil diperbarui', 'data' => $siswa ]); }

Method destroy() – juga dengan filter kepemilikan:

public function destroy($id) { $siswa = Siswa::where('user_id', auth('api')->id())->find($id); if (!$siswa) { return response()->json([ 'success' => false, 'message' => 'Siswa tidak ditemukan' ], 404); } $siswa->delete(); return response()->json([ 'success' => true, 'message' => 'Siswa berhasil dihapus' ]); }
📌 Catatan: Dengan perubahan ini, setiap user hanya bisa melihat dan mengelola data siswa yang dia buat sendiri. Data antar user terisolasi.

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).
🎉 Relasi berhasil! Sekarang setiap pengguna memiliki data siswa yang terpisah. Aplikasi menjadi lebih aman dan personal.

Ringkasan Perubahan

  • ✅ Migration: tambah kolom user_id pada tabel siswa dengan foreign key ke users.
  • ✅ Model: tambah relasi belongsTo di Siswa dan hasMany di User.
  • ✅ Controller: saat store, isi user_id dengan auth('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)

📘 Laravel 12 CRUD (MySQL + JWT) • #13 Menambahkan Relasi User–Siswa (Opsional) • 🔗 Relasi siap!
Lebih baru Lebih lama

نموذج الاتصال