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;
use App\Models\Karyawan;
use App\Models\jabatan;
use Illuminate\Http\Request;
class KaryawanController extends Controller
{
public function index()
{
$karyawan = Karyawan::all();
return view('karyawan.index', compact('karyawan'));
$karyawan = Karyawan::with('jabatan')->get(); // eager load jabatan
return view('karyawan.index', compact('karyawan'));
}
public function create()
{
return view('karyawan.create');
$jabatans = Jabatan::all();
return view('karyawan.create', compact('jabatans'));
}
public function store(Request $request)
{
$request->validate([
$validatedData = $request->validate([
'nama' => 'required',
'umur' => 'required|integer',
'jabatan' => 'required',
'jabatan_id' => 'required|exists:jabatans,id', // sesuaikan dengan name di form
]);
Karyawan::create([
'nama' => $request->nama,
'umur' => $request->umur,
'jabatan' => $request->jabatan,
]);
Karyawan::create($validatedData);
return redirect()->route('karyawan.index')->with('success', 'Data berhasil ditambahkan!');
}
@ -44,27 +43,23 @@ class KaryawanController extends Controller
public function edit($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)
{
$request->validate([
'nama' => 'required',
'umur' => 'required|integer',
'jabatan' => 'required',
]);
$karyawan = Karyawan::findOrFail($id);
$karyawan->update([
'nama' => $request->nama,
'umur' => $request->umur,
'jabatan' => $request->jabatan,
]);
$karyawan->nama = $request->nama;
$karyawan->umur = $request->umur;
$karyawan->jabatan_id = $request->jabatan_id;
$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)
{
$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
{
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->string('nama');
$table->integer('umur');
$table->string('jabatan');
$table->foreignId('jabatan_id')->constrained('jabatans')->onDelete('cascade');
$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
{
$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\Seeder;
use App\Models\Karyawan;
use App\Models\Jabatan;
use Illuminate\Support\Facades\DB;
class KaryawanSeeder extends Seeder
{
@ -13,20 +16,21 @@ class KaryawanSeeder extends Seeder
*/
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',
'umur' => 30,
'jabatan' => 'Manager',
]);
Karyawan::create([
'nama' => 'Ethy Amph la',
'umur' => 28,
'jabatan' => 'staff',
]);
Karyawan::create([
'nama' => 'Neige Saary',
'umur' => 20,
'jabatan' => 'staff',
'jabatan_id' => 1, // ini nama kolom barumu
'created_at' => now(),
'updated_at' => now(),
]);
}

View File

@ -37,7 +37,7 @@
margin-bottom: 8px;
color: #34495e;
}
input {
input, select {
width: 100%;
padding: 12px;
margin-bottom: 20px;
@ -46,7 +46,7 @@
font-size: 16px;
transition: all 0.3s ease;
}
input:focus {
input:focus, select:focus {
outline: none;
border: 1px solid #3498db;
box-shadow: 0 0 8px rgba(52,152,219,0.5);
@ -96,7 +96,14 @@
<input type="number" name="umur" required>
<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>
</form>

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>Edit Data Siswa</title>
<title>Edit Data Karyawan</title>
<style>
* {
margin: 0;
@ -36,18 +36,18 @@
margin-bottom: 8px;
color: #34495e;
}
input {
.form-control {
width: 100%;
padding: 12px;
margin-bottom: 20px;
border-radius: 12px;
border: 1px solid #ddd;
font-size: 16px;
transition: all 0.3s ease;
}
input:focus {
margin-bottom: 20px;
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);
}
.button {
@ -62,7 +62,6 @@
cursor: pointer;
transition: background 0.3s;
}
.alert {
background: #f8d7da;
color: #721c24;
@ -77,24 +76,31 @@
<div class="container">
<h1>Edit Data Karyawan</h1>
<form action="{{ route('karyawan.update', $karyawan->id) }}" method="POST">
@csrf
@method('PUT')
<label>Nama:</label>
<input type="text" name="nama" value="{{ $karyawan->nama }}" required>
<label for="nama">Nama:</label>
<input type="text" name="nama" class="form-control" value="{{ $karyawan->nama }}" required>
<label>Umur:</label>
<input type="number" name="umur" value="{{ $karyawan->umur }}" required>
<label for="umur">Umur:</label>
<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>
</form>
</div>
</body>
</html>
</html>

View File

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