GfMpTfG9TSY9TSCiTUr0TfG0

Tutorial Laravel 12 Untuk Pemula : CRUD Data Aset



Kegiatan 4 — Membuat CRUD Data Aset di Laravel (Routing, Controller, Validasi, dan Blade)

Pada kegiatan ini, kita akan membuat fitur CRUD (Create, Read, Update, Delete) untuk data aset menggunakan Laravel. Target akhirnya adalah aplikasi bisa tambah data, tampil data, edit data, hapus data, dan lihat detail aset.

Ketentuan yang harus ada:

  • Routing menggunakan route resource untuk assets
  • Membuat AssetController dengan method: index, create, store, show, edit, update, destroy
  • Validasi minimal (asset_code unik, name wajib, category_id wajib, condition & status sesuai pilihan)
  • View Blade minimal: daftar aset, tambah, edit, detail
  • Fitur tambahan minimal 1 (contoh: search + pagination)

1) Routing: Gunakan Route Resource

Buka file routes/web.php, lalu tambahkan route resource untuk assets. Jika kamu memakai login, bungkus dengan middleware auth.

use App\Http\Controllers\AssetController;



Route::middleware(['auth'])->group(function () {

    Route::resource('assets', AssetController::class);

});

Dengan Route::resource, Laravel otomatis membuat route untuk CRUD: index, create, store, show, edit, update, destroy.


2) Membuat AssetController

Buat controller dengan perintah berikut:

php artisan make:controller AssetController --resource

Selanjutnya buka file:

app/Http/Controllers/AssetController.php

Isi (atau lengkapi) controller berikut (contoh versi pemula, sudah termasuk search + pagination):

<?php



namespace App\Http\Controllers;



use App\Models\Asset;

use App\Models\Category;

use Illuminate\Http\Request;



class AssetController extends Controller

{

    public function index(Request $request)

    {

        $search = $request->query('search');



        $assets = Asset::with('category')

            ->when($search, function ($query) use ($search) {

                $query->where('asset_code', 'like', "%{$search}%")

                      ->orWhere('name', 'like', "%{$search}%");

            })

            ->latest()

            ->paginate(10)

            ->withQueryString();



        return view('assets.index', compact('assets', 'search'));

    }



    public function create()

    {

        $categories = Category::orderBy('name')->get();

        return view('assets.create', compact('categories'));

    }



    public function store(Request $request)

    {

        $validated = $request->validate([

            'asset_code' => 'required|unique:assets,asset_code',

            'name' => 'required',

            'category_id' => 'required|exists:categories,id',

            'location' => 'required',

            'condition' => 'required|in:baik,rusak ringan,rusak berat',

            'status' => 'required|in:aktif,dipinjam,rusak,dihapuskan',

            'purchase_date' => 'required|date',

            'notes' => 'nullable'

        ]);



        Asset::create($validated);



        return redirect()->route('assets.index')->with('success', 'Data aset berhasil ditambahkan.');

    }



    public function show(Asset $asset)

    {

        $asset->load('category');

        return view('assets.show', compact('asset'));

    }



    public function edit(Asset $asset)

    {

        $categories = Category::orderBy('name')->get();

        return view('assets.edit', compact('asset', 'categories'));

    }



    public function update(Request $request, Asset $asset)

    {

        $validated = $request->validate([

            'asset_code' => 'required|unique:assets,asset_code,' . $asset->id,

            'name' => 'required',

            'category_id' => 'required|exists:categories,id',

            'location' => 'required',

            'condition' => 'required|in:baik,rusak ringan,rusak berat',

            'status' => 'required|in:aktif,dipinjam,rusak,dihapuskan',

            'purchase_date' => 'required|date',

            'notes' => 'nullable'

        ]);



        $asset->update($validated);



        return redirect()->route('assets.index')->with('success', 'Data aset berhasil diperbarui.');

    }



    public function destroy(Asset $asset)

    {

        $asset->delete();

        return redirect()->route('assets.index')->with('success', 'Data aset berhasil dihapus.');

    }

}

3) Pastikan Model Asset Bisa Mass Assignment

Agar Asset::create() dan update() bekerja, buka file:

app/Models/Asset.php

Tambahkan $fillable seperti ini:

protected $fillable = [

    'asset_code',

    'name',

    'category_id',

    'location',

    'condition',

    'status',

    'purchase_date',

    'notes'

];

4) Tambahkan Relasi Category dan Asset

Di Asset.php tambahkan relasi:

public function category()

{

    return $this->belongsTo(Category::class);

}

Di Category.php tambahkan relasi:

public function assets()

{

    return $this->hasMany(Asset::class);

}

5) Membuat View Blade (Minimal 4 Halaman)

Buat folder view:

resources/views/assets

Minimal file yang dibuat:

  • index.blade.php (daftar aset + search + pagination)
  • create.blade.php (form tambah)
  • edit.blade.php (form edit)
  • show.blade.php (detail aset)

A) Halaman Daftar Aset: index.blade.php

<h3>Daftar Aset</h3>



@if(session('success'))

  <p>{{ session('success') }}</p>

@endif



<form method="GET" action="{{ route('assets.index') }}">

  <input type="text" name="search" value="{{ $search }}" placeholder="Cari kode/nama...">

  <button type="submit">Cari</button>

  <a href="{{ route('assets.index') }}">Reset</a>

</form>



<p><a href="{{ route('assets.create') }}">Tambah Aset</a></p>



<table border="1" cellpadding="6">

  <thead>

    <tr>

      <th>Kode</th>

      <th>Nama</th>

      <th>Kategori</th>

      <th>Lokasi</th>

      <th>Kondisi</th>

      <th>Status</th>

      <th>Aksi</th>

    </tr>

  </thead>

  <tbody>

    @foreach($assets as $asset)

      <tr>

        <td>{{ $asset->asset_code }}</td>

        <td>{{ $asset->name }}</td>

        <td>{{ $asset->category?->name }}</td>

        <td>{{ $asset->location }}</td>

        <td>{{ $asset->condition }}</td>

        <td>{{ $asset->status }}</td>

        <td>

          <a href="{{ route('assets.show', $asset) }}">Detail</a> |

          <a href="{{ route('assets.edit', $asset) }}">Edit</a> |

          <form action="{{ route('assets.destroy', $asset) }}" method="POST" style="display:inline">

            @csrf

            @method('DELETE')

            <button type="submit" onclick="return confirm('Yakin hapus data?')">Hapus</button>

          </form>

        </td>

      </tr>

    @endforeach

  </tbody>

</table>



<div>

  {{ $assets->links() }}

</div>

B) Halaman Tambah Aset: create.blade.php

<h3>Tambah Aset</h3>



@if($errors->any())

  <ul>

    @foreach($errors->all() as $error)

      <li>{{ $error }}</li>

    @endforeach

  </ul>

@endif



<form method="POST" action="{{ route('assets.store') }}">

  @csrf



  <p>Kode Aset: <input type="text" name="asset_code" value="{{ old('asset_code') }}"></p>

  <p>Nama: <input type="text" name="name" value="{{ old('name') }}"></p>



  <p>Kategori:

    <select name="category_id">

      <option value="">-- Pilih --</option>

      @foreach($categories as $cat)

        <option value="{{ $cat->id }}" {{ old('category_id')==$cat->id ? 'selected' : '' }}>

          {{ $cat->name }}

        </option>

      @endforeach

    </select>

  </p>



  <p>Lokasi: <input type="text" name="location" value="{{ old('location') }}"></p>



  <p>Kondisi:

    <select name="condition">

      <option value="baik">baik</option>

      <option value="rusak ringan">rusak ringan</option>

      <option value="rusak berat">rusak berat</option>

    </select>

  </p>



  <p>Status:

    <select name="status">

      <option value="aktif">aktif</option>

      <option value="dipinjam">dipinjam</option>

      <option value="rusak">rusak</option>

      <option value="dihapuskan">dihapuskan</option>

    </select>

  </p>



  <p>Tanggal Beli: <input type="date" name="purchase_date" value="{{ old('purchase_date') }}"></p>

  <p>Catatan: <textarea name="notes">{{ old('notes') }}</textarea></p>



  <button type="submit">Simpan</button>

  <a href="{{ route('assets.index') }}">Kembali</a>

</form>

C) Halaman Edit Aset: edit.blade.php

Isinya mirip dengan tambah aset, hanya action-nya update dan data default-nya menggunakan data aset yang dipilih.

<h3>Edit Aset</h3>



@if($errors->any())

  <ul>

    @foreach($errors->all() as $error)

      <li>{{ $error }}</li>

    @endforeach

  </ul>

@endif



<form method="POST" action="{{ route('assets.update', $asset) }}">

  @csrf

  @method('PUT')



  <p>Kode Aset: <input type="text" name="asset_code" value="{{ old('asset_code', $asset->asset_code) }}"></p>

  <p>Nama: <input type="text" name="name" value="{{ old('name', $asset->name) }}"></p>



  <p>Kategori:

    <select name="category_id">

      @foreach($categories as $cat)

        <option value="{{ $cat->id }}" {{ old('category_id', $asset->category_id)==$cat->id ? 'selected' : '' }}>

          {{ $cat->name }}

        </option>

      @endforeach

    </select>

  </p>



  <p>Lokasi: <input type="text" name="location" value="{{ old('location', $asset->location) }}"></p>



  <p>Kondisi:

    <select name="condition">

      @foreach(['baik','rusak ringan','rusak berat'] as $c)

        <option value="{{ $c }}" {{ old('condition', $asset->condition)==$c ? 'selected' : '' }}>{{ $c }}</option>

      @endforeach

    </select>

  </p>



  <p>Status:

    <select name="status">

      @foreach(['aktif','dipinjam','rusak','dihapuskan'] as $s)

        <option value="{{ $s }}" {{ old('status', $asset->status)==$s ? 'selected' : '' }}>{{ $s }}</option>

      @endforeach

    </select>

  </p>



  <p>Tanggal Beli: <input type="date" name="purchase_date" value="{{ old('purchase_date', $asset->purchase_date) }}"></p>

  <p>Catatan: <textarea name="notes">{{ old('notes', $asset->notes) }}</textarea></p>



  <button type="submit">Update</button>

  <a href="{{ route('assets.index') }}">Kembali</a>

</form>

D) Halaman Detail Aset: show.blade.php

<h3>Detail Aset</h3>



<ul>

  <li>Kode: {{ $asset->asset_code }}</li>

  <li>Nama: {{ $asset->name }}</li>

  <li>Kategori: {{ $asset->category?->name }}</li>

  <li>Lokasi: {{ $asset->location }}</li>

  <li>Kondisi: {{ $asset->condition }}</li>

  <li>Status: {{ $asset->status }}</li>

  <li>Tanggal Beli: {{ $asset->purchase_date }}</li>

  <li>Catatan: {{ $asset->notes }}</li>

</ul>



<p>

  <a href="{{ route('assets.edit', $asset) }}">Edit</a> |

  <a href="{{ route('assets.index') }}">Kembali</a>

</p>

6) Fitur Tambahan (Minimal 1)

Pada contoh di atas, kita sudah menerapkan:

  • Pencarian (Search) berdasarkan asset_code atau name
  • Pagination (halaman data) dengan paginate(10)

7) Output yang Harus Dihasilkan

  • Aplikasi bisa tambah, tampil, edit, hapus, dan detail aset
  • Bukti uji berupa screenshot sebelum/sesudah CRUD (misal: sebelum tambah, setelah tambah, edit berhasil, data terhapus)

Selamat mencoba 🚀 

0Komentar

Special Ads
Special Ads
Special Ads