Laravel 9 adalah framework PHP yang powerful dan elegan, sangat populer di kalangan developer web. Salah satu alasan popularitasnya adalah kemudahannya dalam melakukan operasi CRUD (Create, Read, Update, Delete) pada database. Apakah kamu ingin memahami cara membuat CRUD dengan Laravel 9? Artikel ini akan membimbingmu langkah demi langkah dengan contoh kode yang jelas dan penjelasan lengkap. Mari kita mulai!
1. Apa Itu CRUD dan Mengapa Penting dalam Pengembangan Web?
Sebelum kita masuk ke kode, penting untuk memahami konsep dasar CRUD. CRUD adalah singkatan dari:
- Create: Membuat data baru.
- Read: Membaca data yang sudah ada.
- Update: Memperbarui data yang sudah ada.
- Delete: Menghapus data.
Operasi CRUD adalah fondasi dari hampir semua aplikasi web. Bayangkan sebuah aplikasi blog. Kamu perlu membuat postingan (Create), melihat daftar postingan (Read), mengedit postingan (Update), dan menghapus postingan (Delete). Tanpa CRUD, aplikasi tersebut tidak akan berfungsi dengan baik. Memahami proses CRUD di Laravel 9 akan mempercepat pengembangan aplikasi webmu secara signifikan.
2. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum memulai coding, pastikan kamu sudah menginstal Laravel 9 di komputermu dan telah mengkonfigurasi koneksi ke database. Berikut adalah langkah-langkah umumnya:
-
Pastikan PHP dan Composer Terinstall: Laravel membutuhkan PHP (minimal versi 8.0) dan Composer (dependency manager untuk PHP). Pastikan keduanya sudah terinstall dan dikonfigurasi dengan benar.
-
Buat Proyek Laravel Baru: Buka terminal dan jalankan perintah berikut untuk membuat proyek Laravel baru. Ganti
nama-proyek
dengan nama proyek yang kamu inginkan:composer create-project laravel/laravel nama-proyek
-
Konfigurasi Database: Setelah proyek dibuat, buka file
.env
di root direktori proyek. Cari bagian konfigurasi database (diawali denganDB_
). Sesuaikan nilai-nilai berikut sesuai dengan database yang kamu gunakan:DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=username_database DB_PASSWORD=password_database
Ganti
nama_database
,username_database
, danpassword_database
dengan kredensial yang sesuai. -
Migrasi Database: Laravel menggunakan migrations untuk membuat dan memodifikasi struktur database. Kita akan membuat migration untuk tabel yang akan kita gunakan dalam contoh ini. Pastikan database sudah dibuat di MySQL sebelum menjalankan perintah ini.
3. Membuat Model dan Migration untuk Entitas Kita (Contoh: Buku)
Dalam contoh ini, kita akan membuat CRUD untuk entitas “Buku”. Mari kita buat model dan migration untuk entitas ini.
-
Membuat Model dan Migration: Gunakan perintah Artisan untuk membuat model dan migration secara bersamaan:
php artisan make:model Buku -m
Perintah ini akan membuat dua file:
app/Models/Buku.php
(Model)database/migrations/[tanggal_buat]_create_bukus_table.php
(Migration)
-
Modifikasi Migration: Buka file migration yang baru dibuat (
database/migrations/[tanggal_buat]_create_bukus_table.php
). Modifikasi methodup()
untuk mendefinisikan struktur tabelbukus
. Contoh:<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema; return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('bukus', function (Blueprint $table) { $table->id(); $table->string('judul'); $table->string('penulis'); $table->text('deskripsi')->nullable(); $table->integer('tahun_terbit'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('bukus'); } };
Dalam contoh ini, tabel
bukus
memiliki kolomid
(primary key),judul
(string),penulis
(string),deskripsi
(text, opsional), dantahun_terbit
(integer). -
Jalankan Migrasi: Setelah migration dimodifikasi, jalankan perintah berikut untuk membuat tabel di database:
php artisan migrate
-
Modifikasi Model (Opsional): Buka file model
app/Models/Buku.php
. Kamu bisa menambahkan properti$fillable
untuk menentukan kolom mana saja yang boleh diisi saat membuat data baru. Contoh:<?php namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateDatabaseEloquentModel; class Buku extends Model { use HasFactory; protected $fillable = [ 'judul', 'penulis', 'deskripsi', 'tahun_terbit', ]; }
4. Membuat Controller untuk Menangani Logika CRUD
Controller adalah tempat kita akan menulis logika untuk operasi CRUD. Kita akan membuat controller bernama BukuController
.
-
Membuat Controller: Gunakan perintah Artisan untuk membuat controller:
php artisan make:controller BukuController
Perintah ini akan membuat file
app/Http/Controllers/BukuController.php
. -
Implementasi Method CRUD di Controller: Buka file
app/Http/Controllers/BukuController.php
dan implementasikan method-method berikut:index()
: Menampilkan daftar buku.create()
: Menampilkan form untuk membuat buku baru.store()
: Menyimpan buku baru ke database.show()
: Menampilkan detail buku tertentu.edit()
: Menampilkan form untuk mengedit buku yang sudah ada.update()
: Memperbarui buku yang sudah ada di database.destroy()
: Menghapus buku dari database.
Berikut contoh kode untuk BukuController.php
:
<?php
namespace AppHttpControllers;
use AppModelsBuku;
use IlluminateHttpRequest;
class BukuController extends Controller
{
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
public function index()
{
$bukus = Buku::all();
return view('bukus.index', compact('bukus'));
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
return view('bukus.create');
}
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(Request $request)
{
$request->validate([
'judul' => 'required',
'penulis' => 'required',
'tahun_terbit' => 'required|integer',
]);
Buku::create($request->all());
return redirect()->route('bukus.index')
->with('success','Buku berhasil ditambahkan.');
}
/**
* Display the specified resource.
*
* @param AppModelsBuku $buku
* @return IlluminateHttpResponse
*/
public function show(Buku $buku)
{
return view('bukus.show',compact('buku'));
}
/**
* Show the form for editing the specified resource.
*
* @param AppModelsBuku $buku
* @return IlluminateHttpResponse
*/
public function edit(Buku $buku)
{
return view('bukus.edit',compact('buku'));
}
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param AppModelsBuku $buku
* @return IlluminateHttpResponse
*/
public function update(Request $request, Buku $buku)
{
$request->validate([
'judul' => 'required',
'penulis' => 'required',
'tahun_terbit' => 'required|integer',
]);
$buku->update($request->all());
return redirect()->route('bukus.index')
->with('success','Buku berhasil diperbarui');
}
/**
* Remove the specified resource from storage.
*
* @param AppModelsBuku $buku
* @return IlluminateHttpResponse
*/
public function destroy(Buku $buku)
{
$buku->delete();
return redirect()->route('bukus.index')
->with('success','Buku berhasil dihapus');
}
}
Penjelasan Kode Controller:
index()
: Mengambil semua data buku dari database menggunakanBuku::all()
dan mengirimkannya ke viewbukus.index
.create()
: Menampilkan viewbukus.create
yang berisi form untuk membuat buku baru.store(Request $request)
: Menerima data dari form create melalui$request
, melakukan validasi data menggunakan$request->validate()
, membuat buku baru menggunakanBuku::create($request->all())
, dan kemudian redirect ke halamanbukus.index
dengan pesan sukses.show(Buku $buku)
: Menampilkan detail buku berdasarkan ID. Laravel menggunakan route model binding untuk secara otomatis mengambil modelBuku
berdasarkan parameter$buku
.edit(Buku $buku)
: Menampilkan viewbukus.edit
yang berisi form untuk mengedit buku.update(Request $request, Buku $buku)
: Menerima data dari form edit, melakukan validasi, dan memperbarui data buku yang sudah ada menggunakan$buku->update($request->all())
.destroy(Buku $buku)
: Menghapus buku berdasarkan ID menggunakan$buku->delete()
.
5. Membuat Views untuk Menampilkan dan Mengelola Data
Kita perlu membuat views untuk menampilkan data buku, menampilkan form create, dan form edit. Kita akan membuat folder bukus
di dalam folder resources/views
.
Buat file-file berikut:
resources/views/bukus/index.blade.php
(Menampilkan daftar buku)resources/views/bukus/create.blade.php
(Form untuk membuat buku baru)resources/views/bukus/show.blade.php
(Menampilkan detail buku)resources/views/bukus/edit.blade.php
(Form untuk mengedit buku)
Berikut contoh kode untuk masing-masing view:
resources/views/bukus/index.blade.php
<!DOCTYPE html>
<html>
<head>
<title>CRUD Buku Laravel 9</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Daftar Buku</h2>
</div>
<div class="pull-right">
<a class="btn btn-success" href="{{ route('bukus.create') }}"> Tambah Buku Baru</a>
</div>
</div>
</div>
@if ($message = Session::get('success'))
<div class="alert alert-success">
<p>{{ $message }}</p>
</div>
@endif
<table class="table table-bordered">
<tr>
<th>No</th>
<th>Judul</th>
<th>Penulis</th>
<th>Tahun Terbit</th>
<th width="280px">Action</th>
</tr>
@foreach ($bukus as $buku)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $buku->judul }}</td>
<td>{{ $buku->penulis }}</td>
<td>{{ $buku->tahun_terbit }}</td>
<td>
<form action="{{ route('bukus.destroy',$buku->id) }}" method="POST">
<a class="btn btn-info" href="{{ route('bukus.show',$buku->id) }}">Show</a>
<a class="btn btn-primary" href="{{ route('bukus.edit',$buku->id) }}">Edit</a>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Delete</button>
</form>
</td>
</tr>
@endforeach
</table>
{{-- Pagination (Jika data banyak) --}}
{{-- {!! $bukus->links() !!} --}}
</div>
</body>
</html>
resources/views/bukus/create.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Tambah Buku Baru</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Tambah Buku Baru</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('bukus.index') }}"> Kembali</a>
</div>
</div>
</div>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada beberapa kesalahan input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('bukus.store') }}" method="POST">
@csrf
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Judul:</strong>
<input type="text" name="judul" class="form-control" placeholder="Judul">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Penulis:</strong>
<input type="text" name="penulis" class="form-control" placeholder="Penulis">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
<textarea class="form-control" style="height:150px" name="deskripsi" placeholder="Deskripsi"></textarea>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Tahun Terbit:</strong>
<input type="number" name="tahun_terbit" class="form-control" placeholder="Tahun Terbit">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</body>
</html>
resources/views/bukus/show.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Detail Buku</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Show Buku</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('bukus.index') }}"> Back</a>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Judul:</strong>
{{ $buku->judul }}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Penulis:</strong>
{{ $buku->penulis }}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
{{ $buku->deskripsi }}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Tahun Terbit:</strong>
{{ $buku->tahun_terbit }}
</div>
</div>
</div>
</div>
</body>
</html>
resources/views/bukus/edit.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Edit Buku</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-lg-12 margin-tb">
<div class="pull-left">
<h2>Edit Buku</h2>
</div>
<div class="pull-right">
<a class="btn btn-primary" href="{{ route('bukus.index') }}"> Back</a>
</div>
</div>
</div>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada beberapa kesalahan input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('bukus.update',$buku->id) }}" method="POST">
@csrf
@method('PUT')
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Judul:</strong>
<input type="text" name="judul" value="{{ $buku->judul }}" class="form-control" placeholder="Judul">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Penulis:</strong>
<input type="text" name="penulis" value="{{ $buku->penulis }}" class="form-control" placeholder="Penulis">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Deskripsi:</strong>
<textarea class="form-control" style="height:150px" name="deskripsi" placeholder="Deskripsi">{{ $buku->deskripsi }}</textarea>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group">
<strong>Tahun Terbit:</strong>
<input type="number" name="tahun_terbit" value="{{ $buku->tahun_terbit }}" class="form-control" placeholder="Tahun Terbit">
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-12 text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</body>
</html>
Penting: Pastikan kamu sudah menginstall Bootstrap (atau framework CSS lainnya) untuk styling yang lebih baik. Contoh di atas menggunakan CDN Bootstrap.
6. Mendefinisikan Routes untuk Mengakses Controller
Kita perlu mendefinisikan routes di routes/web.php
untuk menghubungkan URL dengan method-method di BukuController
.
Buka file routes/web.php
dan tambahkan kode berikut:
<?php
use IlluminateSupportFacadesRoute;
use AppHttpControllersBukuController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::resource('bukus', BukuController::class);
Baris Route::resource('bukus', BukuController::class);
secara otomatis membuat routes untuk semua method CRUD di BukuController
berdasarkan konvensi naming. Ini sangat menghemat waktu!
Penjelasan:
-
Route::resource('bukus', BukuController::class)
akan membuat routes berikut:GET /bukus
:BukuController@index
(Menampilkan daftar buku)GET /bukus/create
:BukuController@create
(Menampilkan form create)POST /bukus
:BukuController@store
(Menyimpan buku baru)GET /bukus/{buku}
:BukuController@show
(Menampilkan detail buku)GET /bukus/{buku}/edit
:BukuController@edit
(Menampilkan form edit)PUT/PATCH /bukus/{buku}
:BukuController@update
(Memperbarui buku)DELETE /bukus/{buku}
:BukuController@destroy
(Menghapus buku)
7. Menjalankan Aplikasi dan Menguji CRUD
Setelah semua langkah di atas selesai, jalankan aplikasi Laravel kamu menggunakan perintah:
php artisan serve
Buka browser dan akses URL http://localhost:8000/bukus
. Kamu seharusnya melihat daftar buku (yang saat ini masih kosong). Cobalah untuk menambahkan buku baru, mengedit, menampilkan detail, dan menghapus buku. Jika semua langkah diikuti dengan benar, kamu akan berhasil membuat CRUD dengan Laravel 9!
8. Validasi Data Lebih Lanjut untuk Keamanan dan Integritas Data
Validasi data adalah bagian penting dari pengembangan CRUD. Kita sudah menggunakan validasi dasar di method store
dan update
di BukuController
. Kamu bisa menambahkan validasi yang lebih kompleks sesuai kebutuhan aplikasi. Beberapa contoh validasi tambahan:
- Validasi Tipe Data: Memastikan tipe data yang dimasukkan sesuai dengan tipe data kolom di database (misalnya, memastikan
tahun_terbit
adalah angka). - Validasi Panjang Karakter: Membatasi panjang karakter untuk kolom
judul
danpenulis
. - Validasi Unik: Memastikan tidak ada judul buku yang sama (jika judul harus unik).
- Validasi Custom: Membuat validasi sendiri jika ada logika validasi yang kompleks.
Contoh validasi yang lebih lengkap:
public function store(Request $request)
{
$request->validate([
'judul' => 'required|string|max:255|unique:bukus',
'penulis' => 'required|string|max:255',
'deskripsi' => 'nullable|string',
'tahun_terbit' => 'required|integer|min:1900|max:' . date('Y'),
]);
Buku::create($request->all());
return redirect()->route('bukus.index')
->with('success','Buku berhasil ditambahkan.');
}
Penjelasan:
required|string|max:255|unique:bukus
:judul
wajib diisi, harus berupa string, maksimal 255 karakter, dan harus unik di tabelbukus
.nullable|string
:deskripsi
boleh kosong (nullable) dan harus berupa string.required|integer|min:1900|max:
. date(‘Y’):tahun_terbit
wajib diisi, harus berupa integer, minimal tahun 1900, dan maksimal tahun saat ini.
9. Menggunakan Eloquent Relationships (Opsional)
Jika aplikasi kamu memiliki relasi antar tabel (misalnya, satu buku memiliki banyak komentar), kamu bisa menggunakan Eloquent Relationships untuk mempermudah pengelolaan data. Kamu perlu mendefinisikan relasi di model Buku
dan model Komentar
. Contoh:
Model Buku.php
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Buku extends Model
{
use HasFactory;
protected $fillable = [
'judul',
'penulis',
'deskripsi',
'tahun_terbit',
];
public function komentars()
{
return $this->hasMany(Komentar::class);
}
}
Model Komentar.php
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Komentar extends Model
{
use HasFactory;
protected $fillable = [
'buku_id',
'isi',
];
public function buku()
{
return $this->belongsTo(Buku::class);
}
}
Dengan relasi ini, kamu bisa mengakses komentar-komentar dari sebuah buku dengan mudah:
$buku = Buku::find(1);
$komentars = $buku->komentars; // Mengambil semua komentar untuk buku dengan ID 1
10. Keamanan dalam Implementasi CRUD: Mencegah Serangan dan Vulnerability
Keamanan adalah hal yang sangat penting dalam pengembangan web. Saat membuat CRUD, pastikan kamu mengambil langkah-langkah untuk mencegah serangan dan vulnerability:
- Sanitasi Input: Bersihkan input dari user untuk mencegah serangan XSS (Cross-Site Scripting). Gunakan fungsi
htmlspecialchars()
atau helpere()
di Blade untuk menampilkan data. - Proteksi CSRF: Laravel secara otomatis menyediakan proteksi CSRF (Cross-Site Request Forgery). Pastikan kamu menyertakan
@csrf
di semua form. - Autentikasi dan Otorisasi: Pastikan hanya user yang berhak yang bisa mengakses dan memodifikasi data. Gunakan middleware
auth
untuk melindungi routes. - Hindari SQL Injection: Gunakan Eloquent ORM untuk berinteraksi dengan database. Eloquent akan secara otomatis melakukan escaping untuk mencegah SQL Injection. Jangan pernah membuat query SQL secara manual dengan menggabungkan input dari user.
- Rate Limiting: Batasi jumlah request dari satu IP address untuk mencegah serangan brute-force.
11. Tips dan Trik Optimasi CRUD di Laravel 9
Berikut beberapa tips dan trik untuk mengoptimasi performa CRUD di Laravel 9:
- Eager Loading: Gunakan eager loading untuk mengurangi jumlah query database. Misalnya, jika kamu menampilkan daftar buku beserta penulisnya, gunakan
Buku::with('penulis')->get()
untuk mengambil data buku dan penulis dalam satu query. - Caching: Gunakan caching untuk menyimpan data yang sering diakses.
- Pagination: Gunakan pagination untuk menampilkan data dalam jumlah besar secara efisien. Eloquent ORM menyediakan fitur pagination yang mudah digunakan.
- Indexing Database: Tambahkan index pada kolom-kolom yang sering digunakan dalam query untuk mempercepat pencarian data.
- Query Optimization: Analisa query database kamu dan optimalkan jika ada query yang lambat.
12. Kesimpulan: Sukses Membuat CRUD dengan Laravel 9
Selamat! Kamu telah mempelajari cara membuat CRUD dengan Laravel 9 secara lengkap. Dengan pemahaman yang baik tentang model, migration, controller, views, dan routes, kamu sekarang dapat membuat aplikasi web yang lebih kompleks dan dinamis. Ingatlah untuk selalu memperhatikan keamanan dan optimasi untuk menghasilkan aplikasi yang handal dan efisien. Selamat mencoba dan teruslah belajar!