fix db, admin & siswa update

This commit is contained in:
RetasyaSalsabila 2026-03-07 12:37:33 +07:00
parent 40058c47cd
commit e0db94bf1a
4 changed files with 212 additions and 81 deletions

View File

@ -1,102 +1,115 @@
<?php
// ============================================================
// FILE 1: app/Http/Controllers/Admin/MapelController.php
// ============================================================
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Mapel;
use App\Models\Kelas;
use App\Models\Mengajar;
use Illuminate\Http\Request;
class MapelController extends Controller
{
public function index(Request $request)
{
$query = Mapel::query();
$query = Mapel::with('kelas');
// SEARCH
if ($request->has('search')) {
$search = $request->search;
$query->where('nama_mapel', 'like', "%$search%")
->orWhere('id_mapel', 'like', "%$search%");
}
// FILTER BY KELAS (lewat table mengajars)
if ($request->has('filter_kelas') && $request->filter_kelas != '') {
$query->whereHas('mengajars', function($q) use ($request) {
$q->where('id_kelas', $request->filter_kelas);
if ($request->search) {
$query->where(function ($q) use ($request) {
$q->where('nama_mapel', 'like', "%$request->search%")
->orWhere('id_mapel', 'like', "%$request->search%");
});
}
// FILTER KELAS
if ($request->filter_kelas) {
$query->whereHas('kelas', function ($q) use ($request) {
$q->where('kelas.id_kelas', $request->filter_kelas);
});
}
// SHOW PER PAGE
$perPage = $request->get('perPage', 10);
$mapels = $query->paginate($perPage)->appends($request->all());
// Ambil semua kelas untuk dropdown filter
$kelass = Kelas::orderBy('tingkat')->orderBy('nama_kelas')->get();
$kelass = Kelas::orderBy('tingkat')
->orderBy('nama_kelas')
->get();
return view('admin.mapel.index', compact('mapels', 'kelass'));
}
public function store(Request $request)
{
$validated = $request->validate([
'nama_mapel' => 'required|string|max:100',
'kelas' => 'nullable|array'
]);
$mapel = Mapel::create([
'nama_mapel' => $validated['nama_mapel'],
]);
if($request->kelas){
foreach($request->kelas as $kelas){
$mapel->mengajars()->create([
'id_kelas' => $kelas
]);
}
}
return redirect()->route('admin.mapel.index')
->with('success','Data mata pelajaran berhasil ditambahkan!');
}
public function update(Request $request, $id_mapel)
{
$mapel = Mapel::findOrFail($id_mapel);
$validated = $request->validate([
'nama_mapel' => 'required|string|max:100',
'kelas' => 'nullable|array'
]);
$mapel->update([
'nama_mapel' => $validated['nama_mapel']
]);
// hapus relasi lama
$mapel->mengajars()->delete();
// buat relasi baru
if($request->kelas){
foreach($request->kelas as $kelas){
$mapel->mengajars()->create([
'id_kelas' => $kelas
]);
}
}
return redirect()->route('admin.mapel.index')
->with('success','Data mata pelajaran berhasil diupdate!');
}
public function destroy($id_mapel)
{
$mapel = Mapel::findOrFail($id_mapel);
$request->validate([
'nama_mapel' => 'required|max:100',
'kelas' => 'required|array'
]);
$mapel = Mapel::create([
'nama_mapel' => $request->nama_mapel
]);
foreach ($request->kelas as $kelas) {
Mengajar::create([
'id_mapel' => $mapel->id_mapel,
'id_kelas' => $kelas,
'id_guru' => null
]);
}
return redirect()->route('admin.mapel.index')
->with('success', 'Data mata pelajaran berhasil ditambahkan!');
}
public function update(Request $request, $id)
{
$request->validate([
'nama_mapel' => 'required|max:100',
'kelas' => 'required|array'
]);
$mapel = Mapel::findOrFail($id);
$mapel->update([
'nama_mapel' => $request->nama_mapel
]);
// hapus relasi lama
Mengajar::where('id_mapel', $mapel->id_mapel)->delete();
// simpan relasi baru
foreach ($request->kelas as $kelas) {
Mengajar::create([
'id_mapel' => $mapel->id_mapel,
'id_kelas' => $kelas,
'id_guru' => null
]);
}
return redirect()->route('admin.mapel.index')
->with('success', 'Data mata pelajaran berhasil diupdate!');
}
public function destroy($id)
{
$mapel = Mapel::findOrFail($id);
Mengajar::where('id_mapel', $id)->delete();
$mapel->delete();
return redirect()->route('admin.mapel.index')

View File

@ -31,4 +31,15 @@ public function mengajars()
{
return $this->hasMany(Mengajar::class, 'id_kelas', 'id_kelas');
}
public function mapels()
{
return $this->belongsToMany(
Mapel::class,
'mengajars',
'id_kelas',
'id_mapel'
);
}
}

View File

@ -0,0 +1,62 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
public function up(): void
{
// 1. Matikan FK sementara
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
// 2. Hapus FK lama jika ada
try {
DB::statement('ALTER TABLE mengajars DROP FOREIGN KEY mengajars_id_mapel_foreign');
} catch (\Exception $e) {}
try {
DB::statement('ALTER TABLE mengajars DROP FOREIGN KEY mengajars_id_kelas_foreign');
} catch (\Exception $e) {}
try {
DB::statement('ALTER TABLE mengajars DROP FOREIGN KEY mengajars_id_guru_new_foreign');
} catch (\Exception $e) {}
// 3. Ubah tipe kolom
DB::statement('ALTER TABLE mengajars MODIFY id_mapel BIGINT UNSIGNED');
DB::statement('ALTER TABLE mengajars MODIFY id_kelas BIGINT UNSIGNED');
DB::statement('ALTER TABLE mengajars MODIFY id_guru BIGINT UNSIGNED');
// 4. Tambahkan FK baru
DB::statement('
ALTER TABLE mengajars
ADD CONSTRAINT fk_mengajar_mapel
FOREIGN KEY (id_mapel) REFERENCES mapels(id_mapel)
ON DELETE CASCADE
');
DB::statement('
ALTER TABLE mengajars
ADD CONSTRAINT fk_mengajar_kelas
FOREIGN KEY (id_kelas) REFERENCES kelas(id_kelas)
ON DELETE CASCADE
');
DB::statement('
ALTER TABLE mengajars
ADD CONSTRAINT fk_mengajar_guru
FOREIGN KEY (id_guru) REFERENCES gurus(id_guru)
ON DELETE CASCADE
');
// 5. Hidupkan lagi FK
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
public function down(): void
{
//
}
};

View File

@ -158,6 +158,7 @@
<th>No</th>
<th>ID Mapel</th>
<th>Nama Mata Pelajaran</th>
<th>Kelas</th>
<th>Aksi</th>
</tr>
</thead>
@ -169,10 +170,24 @@
<td>{{ $mapel->id_mapel }}</td>
<td>{{ $mapel->nama_mapel }}</td>
<td>
@if($mapel->kelas->count())
@foreach($mapel->kelas as $kelas)
<span class="badge bg-info">
{{ $kelas->tingkat }} {{ $kelas->nama_kelas }}
</span>
@endforeach
@else
<span class="text-muted">Belum ada kelas</span>
@endif
</td>
<td>
<button onclick="openEditModal(
'{{ $mapel->id_mapel }}',
'{{ $mapel->nama_mapel }}'
'{{ $mapel->id_mapel }}',
'{{ $mapel->nama_mapel }}',
{{ $mapel->kelas->pluck('id_kelas') }}
)" style="border:none;background:none">
<img src="{{ asset('images/icon/main/edit.png') }}" class="action-icon">
</button>
@ -231,17 +246,22 @@
</div>
<div class="mb-3">
<label>Kelas</label>
<label>Pilih Kelas</label>
<select name="kelas[]" class="form-control" multiple required>
<select name="kelas[]" class="form-select" multiple>
@foreach($kelass as $kelas)
<option value="{{ $kelas->id_kelas }}">
{{ $kelas->tingkat }} - {{ $kelas->nama_kelas }}
{{ $kelas->tingkat }} {{ $kelas->nama_kelas }}
</option>
@endforeach
</select>
<small class="text-muted">Bisa pilih lebih dari satu kelas</small>
<small class="text-muted">Tekan CTRL untuk memilih lebih dari satu kelas</small>
</div>
@ -288,6 +308,25 @@
</div>
<div class="mb-3">
<label>Pilih Kelas</label>
<select name="kelas[]" id="editKelas" class="form-control" multiple required>
@foreach($kelass as $kelas)
<option value="{{ $kelas->id_kelas }}">
{{ $kelas->tingkat }} {{ $kelas->nama_kelas }}
</option>
@endforeach
</select>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button class="btn btn-success">Update</button>
@ -300,14 +339,20 @@
</div>
<script>
function openEditModal(idMapel, namaMapel) {
function openEditModal(idMapel, namaMapel, kelasMapel)
{
document.getElementById('editIdMapel').value = idMapel;
document.getElementById('editNamaMapel').value = namaMapel;
document.getElementById('formEdit').action =
document.getElementById('formEdit').action = "{{ url('admin/mapel') }}/" + idMapel;
"{{ url('admin/mapel') }}/" + idMapel;
let select = document.getElementById('editKelas');
for (let option of select.options) {
option.selected = kelasMapel.includes(parseInt(option.value));
}
new bootstrap.Modal(document.getElementById('modalEdit')).show();
}
}
</script>
@if ($errors->any())