Penggunaan Eloquent Relation One to Many untuk database karyawan dan jabatan

This commit is contained in:
adelyaou 2025-07-24 16:42:00 +07:00
parent a0ab44bdb4
commit 3a50f17777
11 changed files with 157 additions and 59 deletions

View File

@ -3,34 +3,33 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Karyawan; use App\Models\Karyawan;
use App\Models\jabatan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class KaryawanController extends Controller class KaryawanController extends Controller
{ {
public function index() public function index()
{ {
$karyawan = Karyawan::all(); $karyawan = Karyawan::with('jabatan')->get(); // eager load jabatan
return view('karyawan.index', compact('karyawan')); return view('karyawan.index', compact('karyawan'));
} }
public function create() public function create()
{ {
return view('karyawan.create'); $jabatans = Jabatan::all();
return view('karyawan.create', compact('jabatans'));
} }
public function store(Request $request) public function store(Request $request)
{ {
$request->validate([ $validatedData = $request->validate([
'nama' => 'required', 'nama' => 'required',
'umur' => 'required|integer', 'umur' => 'required|integer',
'jabatan' => 'required', 'jabatan_id' => 'required|exists:jabatans,id', // sesuaikan dengan name di form
]); ]);
Karyawan::create([ Karyawan::create($validatedData);
'nama' => $request->nama,
'umur' => $request->umur,
'jabatan' => $request->jabatan,
]);
return redirect()->route('karyawan.index')->with('success', 'Data berhasil ditambahkan!'); return redirect()->route('karyawan.index')->with('success', 'Data berhasil ditambahkan!');
} }
@ -44,27 +43,23 @@ class KaryawanController extends Controller
public function edit($id) public function edit($id)
{ {
$karyawan = Karyawan::findOrFail($id); $karyawan = Karyawan::findOrFail($id);
return view('karyawan.edit', compact('karyawan', 'id')); $jabatans = Jabatan::all();
return view('karyawan.edit', compact('karyawan', 'jabatans'));
} }
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
$request->validate([
'nama' => 'required',
'umur' => 'required|integer',
'jabatan' => 'required',
]);
$karyawan = Karyawan::findOrFail($id); $karyawan = Karyawan::findOrFail($id);
$karyawan->update([ $karyawan->nama = $request->nama;
'nama' => $request->nama, $karyawan->umur = $request->umur;
'umur' => $request->umur, $karyawan->jabatan_id = $request->jabatan_id;
'jabatan' => $request->jabatan, $karyawan->save();
]);
return redirect()->route('karyawan.index')->with('success', 'Data berhasil diperbarui!'); return redirect()->route('karyawan.index')->with('success', 'Data berhasil diupdate');
} }
public function destroy($id) public function destroy($id)
{ {
$karyawan = Karyawan::findOrFail($id); $karyawan = Karyawan::findOrFail($id);

View File

@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class jabatan extends Model
{
use HasFactory;
protected $fillable = ['jabatan'];
public function karyawans()
{
return $this->hasMany(Karyawan::class, 'jabatan_id');
}
}

View File

@ -6,5 +6,11 @@ use Illuminate\Database\Eloquent\Model;
class karyawan extends Model class karyawan extends Model
{ {
protected $fillable = ['nama', 'umur', 'jabatan']; protected $fillable = ['nama', 'umur', 'jabatan_id'];
public function jabatan()
{
return $this->belongsTo(Jabatan::class, 'jabatan_id'); // karena 'jabatan' adalah foreign key
}
} }

View File

@ -15,7 +15,7 @@ return new class extends Migration
$table->id(); $table->id();
$table->string('nama'); $table->string('nama');
$table->integer('umur'); $table->integer('umur');
$table->string('jabatan'); $table->foreignId('jabatan_id')->constrained('jabatans')->onDelete('cascade');
$table->timestamps(); $table->timestamps();
}); });
} }

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('jabatans', function (Blueprint $table) {
$table->id();
$table->string('jabatan'); // Kolom untuk nama jabatan
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('jabatans');
}
};

View File

@ -14,8 +14,12 @@ class DatabaseSeeder extends Seeder
public function run(): void public function run(): void
{ {
$this->call(KaryawanSeeder::class); $this->call([
JabatanSeeder::class,
KaryawanSeeder::class
]);
} }
} }

View File

@ -0,0 +1,28 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Jabatan;
class JabatanSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$jabatans = [
'CEO',
'OWNER',
'HRD',
'MANAGER',
'STAFF',
];
foreach ($jabatans as $jabatan) {
Jabatan::create(['jabatan' => $jabatan]);
}
}
}

View File

@ -5,6 +5,9 @@ namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use App\Models\Karyawan; use App\Models\Karyawan;
use App\Models\Jabatan;
use Illuminate\Support\Facades\DB;
class KaryawanSeeder extends Seeder class KaryawanSeeder extends Seeder
{ {
@ -13,20 +16,21 @@ class KaryawanSeeder extends Seeder
*/ */
public function run(): void public function run(): void
{ {
Karyawan::create([
$manager = Jabatan::where('jabatan', 'MANAGER')->first();
$staff = Jabatan::where('jabatan', 'STAFF')->first();
// Cek apakah jabatan tersedia
if (!$manager || !$staff) {
throw new \Exception("Jabatan belum tersedia. Pastikan JabatanSeeder sudah jalan.");
}
DB::table('karyawans')->insert([
'nama' => 'John Doe', 'nama' => 'John Doe',
'umur' => 30, 'umur' => 30,
'jabatan' => 'Manager', 'jabatan_id' => 1, // ini nama kolom barumu
]); 'created_at' => now(),
Karyawan::create([ 'updated_at' => now(),
'nama' => 'Ethy Amph la',
'umur' => 28,
'jabatan' => 'staff',
]);
Karyawan::create([
'nama' => 'Neige Saary',
'umur' => 20,
'jabatan' => 'staff',
]); ]);
} }

View File

@ -37,7 +37,7 @@
margin-bottom: 8px; margin-bottom: 8px;
color: #34495e; color: #34495e;
} }
input { input, select {
width: 100%; width: 100%;
padding: 12px; padding: 12px;
margin-bottom: 20px; margin-bottom: 20px;
@ -46,7 +46,7 @@
font-size: 16px; font-size: 16px;
transition: all 0.3s ease; transition: all 0.3s ease;
} }
input:focus { input:focus, select:focus {
outline: none; outline: none;
border: 1px solid #3498db; border: 1px solid #3498db;
box-shadow: 0 0 8px rgba(52,152,219,0.5); box-shadow: 0 0 8px rgba(52,152,219,0.5);
@ -96,7 +96,14 @@
<input type="number" name="umur" required> <input type="number" name="umur" required>
<label>Jabatan:</label> <label>Jabatan:</label>
<input type="text" name="jabatan" required> <select name="jabatan_id" class="form-control" required>
<option value="">-- Pilih Jabatan --</option>
@foreach($jabatans as $jabatan)
<option value="{{ $jabatan->id }}">{{ $jabatan->jabatan }}</option>
@endforeach
</select>
<button type="submit" class="button">Simpan Data</button> <button type="submit" class="button">Simpan Data</button>
</form> </form>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Edit Data Siswa</title> <title>Edit Data Karyawan</title>
<style> <style>
* { * {
margin: 0; margin: 0;
@ -36,18 +36,18 @@
margin-bottom: 8px; margin-bottom: 8px;
color: #34495e; color: #34495e;
} }
input { .form-control {
width: 100%; width: 100%;
padding: 12px; padding: 12px;
margin-bottom: 20px;
border-radius: 12px; border-radius: 12px;
border: 1px solid #ddd; border: 1px solid #ddd;
font-size: 16px; font-size: 16px;
transition: all 0.3s ease; margin-bottom: 20px;
}
input:focus {
outline: none; outline: none;
border: 1px solid #b64fdb; transition: border-color 0.3s, box-shadow 0.3s;
}
.form-control:focus {
border-color: #b64fdb;
box-shadow: 0 0 8px rgba(52,152,219,0.5); box-shadow: 0 0 8px rgba(52,152,219,0.5);
} }
.button { .button {
@ -62,7 +62,6 @@
cursor: pointer; cursor: pointer;
transition: background 0.3s; transition: background 0.3s;
} }
.alert { .alert {
background: #f8d7da; background: #f8d7da;
color: #721c24; color: #721c24;
@ -77,24 +76,31 @@
<div class="container"> <div class="container">
<h1>Edit Data Karyawan</h1> <h1>Edit Data Karyawan</h1>
<form action="{{ route('karyawan.update', $karyawan->id) }}" method="POST"> <form action="{{ route('karyawan.update', $karyawan->id) }}" method="POST">
@csrf @csrf
@method('PUT') @method('PUT')
<label>Nama:</label> <label for="nama">Nama:</label>
<input type="text" name="nama" value="{{ $karyawan->nama }}" required> <input type="text" name="nama" class="form-control" value="{{ $karyawan->nama }}" required>
<label>Umur:</label> <label for="umur">Umur:</label>
<input type="number" name="umur" value="{{ $karyawan->umur }}" required> <input type="number" name="umur" class="form-control" value="{{ $karyawan->umur }}" required>
<label for="jabatan_id">Jabatan:</label>
<select name="jabatan_id" required>
<option value="" disabled selected>-- Pilih Jabatan --</option>
@foreach ($jabatans as $jabatan)
<option value="{{ $jabatan->id }}" {{ $karyawan->jabatan_id == $jabatan->id ? 'selected' : '' }}>
{{ $jabatan->jabatan }}
</option>
@endforeach
</select>
<label>Jabatan:</label>
<input type="text" name="jabatan" value="{{ $karyawan->jabatan }}" required>
<button type="submit" class="button">Update</button> <button type="submit" class="button">Update</button>
</form> </form>
</div> </div>
</body> </body>
</html> </html>

View File

@ -127,7 +127,8 @@
<td>{{ $row->id }}</td> <td>{{ $row->id }}</td>
<td>{{ $row->nama }}</td> <td>{{ $row->nama }}</td>
<td>{{ $row->umur }}</td> <td>{{ $row->umur }}</td>
<td>{{ $row->jabatan }}</td> <td>{{ $row->jabatan()->first()?->jabatan ?? '-' }}</td>
<td> <td>
<a href="{{ route('karyawan.edit', $row->id) }}" class="button-opsi">Edit</a> <a href="{{ route('karyawan.edit', $row->id) }}" class="button-opsi">Edit</a>
<!-- <a href="{{ route('karyawan.show', $row->id) }}" class="button-opsi">Lihat</a> --> <!-- <a href="{{ route('karyawan.show', $row->id) }}" class="button-opsi">Lihat</a> -->