Laravel 9 adalah framework PHP yang powerful dan populer untuk membangun aplikasi web modern. Salah satu operasi dasar dalam pengembangan web adalah CRUD (Create, Read, Update, Delete), dan Laravel sangat memudahkan proses ini. Artikel ini akan memberikan panduan lengkap cara membuat CRUD dengan Laravel 9 Indonesia, lengkap dengan contoh kode yang mudah dipahami. Mari kita mulai!
1. Pengenalan CRUD dan Manfaatnya dalam Pengembangan Web dengan Laravel 9
Sebelum kita masuk ke detail implementasi, mari kita pahami dulu apa itu CRUD dan mengapa penting dalam pengembangan web, khususnya dengan Laravel 9.
Apa itu CRUD?
CRUD adalah singkatan dari:
- Create (Buat): Membuat data baru dalam database.
- Read (Baca): Mengambil data dari database.
- Update (Ubah): Memperbarui data yang sudah ada dalam database.
- Delete (Hapus): Menghapus data dari database.
CRUD merupakan fondasi dari banyak aplikasi web. Setiap kali Anda membuat postingan di media sosial, mengedit profil, mencari produk di toko online, atau menghapus item dari keranjang belanja, Anda sedang berinteraksi dengan operasi CRUD.
Mengapa CRUD Penting dalam Laravel 9?
Laravel 9 menyediakan banyak fitur dan alat bantu yang mempermudah implementasi CRUD, antara lain:
- Eloquent ORM: Sistem Object-Relational Mapping (ORM) yang memudahkan interaksi dengan database menggunakan sintaks yang bersih dan mudah dibaca.
- Migrations: Cara mudah untuk mengelola skema database melalui kode, memungkinkan Anda membuat, mengubah, dan menghapus tabel dengan mudah.
- Controllers: Mengatur logika aplikasi dan menangani permintaan HTTP yang terkait dengan operasi CRUD.
- Routes: Mendefinisikan URL yang mengarah ke controller untuk menangani operasi CRUD.
- Blade Templating Engine: Membuat tampilan yang dinamis dan mudah dikelola untuk menampilkan data dan formulir.
Dengan menggunakan Laravel 9, Anda dapat membangun aplikasi CRUD dengan lebih cepat, efisien, dan terstruktur.
2. Persiapan Awal: Instalasi Laravel 9 dan Konfigurasi Database
Sebelum memulai cara membuat CRUD dengan Laravel 9, pastikan Anda sudah memiliki lingkungan pengembangan yang siap. Ini termasuk PHP, Composer (package manager untuk PHP), dan database (misalnya MySQL atau PostgreSQL).
Instalasi Laravel 9:
Buka terminal atau command prompt Anda dan jalankan perintah berikut untuk membuat project Laravel 9 baru:
composer create-project laravel/laravel nama-project
Ganti nama-project dengan nama yang Anda inginkan untuk project Anda. Setelah proses instalasi selesai, masuk ke direktori project:
cd nama-project
Konfigurasi Database:
Selanjutnya, Anda perlu mengkonfigurasi koneksi database. Buka file .env yang terletak di root project Anda. Cari bagian yang berhubungan dengan database (biasanya dimulai dengan DB_). Sesuaikan nilainya sesuai dengan konfigurasi database Anda:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_user
DB_PASSWORD=password_database
DB_CONNECTION: Jenis database yang digunakan (misalnyamysql,pgsql,sqlite).DB_HOST: Alamat host database.DB_PORT: Port database.DB_DATABASE: Nama database yang akan digunakan.DB_USERNAME: Username untuk mengakses database.DB_PASSWORD: Password untuk mengakses database.
Setelah mengubah file .env, pastikan Anda menjalankan perintah berikut untuk me-refresh konfigurasi:
php artisan config:cache
3. Membuat Model dan Migrasi Database: Langkah Fundamental CRUD Laravel 9
Langkah selanjutnya dalam cara membuat CRUD dengan Laravel 9 adalah membuat model dan migrasi database. Model akan merepresentasikan tabel database kita dan mempermudah interaksi dengannya, sedangkan migrasi akan digunakan untuk membuat dan mengelola skema database.
Misalkan kita akan membuat CRUD untuk data “Produk”. Kita akan membuat model Product dan migrasi untuk tabel products.
Membuat Model:
Gunakan perintah Artisan berikut untuk membuat model Product:
php artisan make:model Product
Ini akan membuat file Product.php di direktori app/Models. Anda dapat membuka file ini dan menambahkan properti $fillable untuk menentukan kolom mana yang boleh diisi secara massal (mass assignment):
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
protected $fillable = [
'nama',
'deskripsi',
'harga',
];
}
Membuat Migrasi:
Selanjutnya, buat migrasi untuk tabel products dengan perintah berikut:
php artisan make:migration create_products_table --create=products
Ini akan membuat file migrasi di direktori database/migrations. Buka file migrasi ini dan definisikan struktur tabel yang Anda inginkan:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->text('deskripsi');
$table->decimal('harga', 10, 2); // Harga dengan 10 digit total dan 2 digit desimal
$table->timestamps(); // Kolom created_at dan updated_at
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
};
Menjalankan Migrasi:
Setelah mendefinisikan struktur tabel, jalankan migrasi untuk membuat tabel products di database Anda:
php artisan migrate
Perintah ini akan menjalankan semua migrasi yang belum dijalankan dan membuat tabel yang sesuai di database Anda.
4. Membuat Controller untuk Menangani Logika CRUD: Langkah Utama CRUD Laravel 9
Controller adalah bagian penting dari cara membuat CRUD dengan Laravel 9. Controller bertugas menerima permintaan HTTP, berinteraksi dengan model, dan mengembalikan respons (biasanya berupa tampilan).
Buat controller ProductController dengan perintah berikut:
php artisan make:controller ProductController
Ini akan membuat file ProductController.php di direktori app/Http/Controllers. Buka file ini dan tambahkan method-method untuk menangani operasi CRUD:
<?php
namespace AppHttpControllers;
use AppModelsProduct;
use IlluminateHttpRequest;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return IlluminateHttpResponse
*/
public function index()
{
$products = Product::all(); // Mengambil semua data produk
return view('products.index', compact('products')); // Mengirim data ke view products/index.blade.php
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateHttpResponse
*/
public function create()
{
return view('products.create'); // Menampilkan form untuk membuat produk baru
}
/**
* Store a newly created resource in storage.
*
* @param IlluminateHttpRequest $request
* @return IlluminateHttpResponse
*/
public function store(Request $request)
{
$request->validate([
'nama' => 'required',
'deskripsi' => 'required',
'harga' => 'required|numeric',
]);
Product::create($request->all()); // Membuat produk baru berdasarkan data dari request
return redirect()->route('products.index')
->with('success', 'Produk berhasil ditambahkan.'); // Mengarahkan kembali ke halaman index dengan pesan sukses
}
/**
* Display the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function show(Product $product)
{
return view('products.show', compact('product')); // Menampilkan detail produk
}
/**
* Show the form for editing the specified resource.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function edit(Product $product)
{
return view('products.edit', compact('product')); // Menampilkan form untuk mengedit produk
}
/**
* Update the specified resource in storage.
*
* @param IlluminateHttpRequest $request
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function update(Request $request, Product $product)
{
$request->validate([
'nama' => 'required',
'deskripsi' => 'required',
'harga' => 'required|numeric',
]);
$product->update($request->all()); // Memperbarui data produk berdasarkan data dari request
return redirect()->route('products.index')
->with('success', 'Produk berhasil diperbarui.'); // Mengarahkan kembali ke halaman index dengan pesan sukses
}
/**
* Remove the specified resource from storage.
*
* @param AppModelsProduct $product
* @return IlluminateHttpResponse
*/
public function destroy(Product $product)
{
$product->delete(); // Menghapus produk
return redirect()->route('products.index')
->with('success', 'Produk berhasil dihapus.'); // Mengarahkan kembali ke halaman index dengan pesan sukses
}
}
Setiap method dalam controller di atas mewakili satu operasi CRUD:
index(): Menampilkan daftar semua produk.create(): Menampilkan form untuk membuat produk baru.store(): Menyimpan produk baru ke database.show(): Menampilkan detail produk.edit(): Menampilkan form untuk mengedit produk.update(): Memperbarui data produk di database.destroy(): Menghapus produk dari database.
Perhatikan penggunaan Product::all(), Product::create(), Product::find(), Product::update(), dan Product::delete() untuk berinteraksi dengan database melalui Eloquent ORM.
5. Membuat Routes untuk Mengarahkan Permintaan ke Controller: Konfigurasi URL CRUD Laravel 9
Setelah membuat controller, kita perlu mendefinisikan routes yang akan mengarahkan permintaan HTTP ke method yang sesuai di controller. Buka file routes/web.php dan tambahkan routes berikut:
<?php
use AppHttpControllersProductController;
use IlluminateSupportFacadesRoute;
/*
|--------------------------------------------------------------------------
| 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('products', ProductController::class);
Route::resource('products', ProductController::class) secara otomatis akan membuat routes untuk semua operasi CRUD pada resource products. Ini setara dengan mendefinisikan routes berikut secara manual:
GET /products:ProductController@indexGET /products/create:ProductController@createPOST /products:ProductController@storeGET /products/{product}:ProductController@showGET /products/{product}/edit:ProductController@editPUT/PATCH /products/{product}:ProductController@updateDELETE /products/{product}:ProductController@destroy
6. Membuat View untuk Menampilkan Data dan Formulir: Antarmuka Pengguna CRUD Laravel 9
Langkah terakhir dalam cara membuat CRUD dengan Laravel 9 adalah membuat view untuk menampilkan data dan formulir. View akan menampilkan daftar produk, detail produk, dan formulir untuk membuat dan mengedit produk.
Buat direktori resources/views/products dan buat file-file view berikut:
index.blade.php: Menampilkan daftar produk.create.blade.php: Menampilkan form untuk membuat produk baru.show.blade.php: Menampilkan detail produk.edit.blade.php: Menampilkan form untuk mengedit produk.
Berikut adalah contoh isi dari masing-masing file view:
resources/views/products/index.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Daftar Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Daftar Produk</h1>
<a href="{{ route('products.create') }}" class="btn btn-primary mb-3">Tambah Produk Baru</a>
@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>Nama</th>
<th>Deskripsi</th>
<th>Harga</th>
<th width="280px">Aksi</th>
</tr>
@foreach ($products as $product)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $product->nama }}</td>
<td>{{ $product->deskripsi }}</td>
<td>{{ $product->harga }}</td>
<td>
<form action="{{ route('products.destroy',$product->id) }}" method="POST">
<a class="btn btn-info" href="{{ route('products.show',$product->id) }}">Tampilkan</a>
<a class="btn btn-primary" href="{{ route('products.edit',$product->id) }}">Edit</a>
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">Hapus</button>
</form>
</td>
</tr>
@endforeach
</table>
{{-- Tambahkan Pagination Jika Data Banyak --}}
</div>
</body>
</html>
resources/views/products/create.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Tambah Produk Baru</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Tambah Produk Baru</h1>
<a class="btn btn-primary mb-3" href="{{ route('products.index') }}"> Kembali</a>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada kesalahan dalam input Anda.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('products.store') }}" method="POST">
@csrf
<div class="mb-3">
<label for="nama" class="form-label">Nama:</label>
<input type="text" class="form-control" name="nama" placeholder="Nama">
</div>
<div class="mb-3">
<label for="deskripsi" class="form-label">Deskripsi:</label>
<textarea class="form-control" name="deskripsi" placeholder="Deskripsi"></textarea>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga:</label>
<input type="number" step="0.01" class="form-control" name="harga" placeholder="Harga">
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
</form>
</div>
</body>
</html>
resources/views/products/show.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Detail Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Detail Produk</h1>
<a class="btn btn-primary mb-3" href="{{ route('products.index') }}"> Kembali</a>
<div class="mb-3">
<strong>Nama:</strong>
{{ $product->nama }}
</div>
<div class="mb-3">
<strong>Deskripsi:</strong>
{{ $product->deskripsi }}
</div>
<div class="mb-3">
<strong>Harga:</strong>
{{ $product->harga }}
</div>
</div>
</body>
</html>
resources/views/products/edit.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Edit Produk</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>Edit Produk</h1>
<a class="btn btn-primary mb-3" href="{{ route('products.index') }}"> Kembali</a>
@if ($errors->any())
<div class="alert alert-danger">
<strong>Whoops!</strong> Ada kesalahan dalam input Anda.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('products.update',$product->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="nama" class="form-label">Nama:</label>
<input type="text" class="form-control" name="nama" value="{{ $product->nama }}" placeholder="Nama">
</div>
<div class="mb-3">
<label for="deskripsi" class="form-label">Deskripsi:</label>
<textarea class="form-control" name="deskripsi" placeholder="Deskripsi">{{ $product->deskripsi }}</textarea>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga:</label>
<input type="number" step="0.01" class="form-control" name="harga" value="{{ $product->harga }}" placeholder="Harga">
</div>
<button type="submit" class="btn btn-primary">Perbarui</button>
</form>
</div>
</body>
</html>
Pastikan Anda sudah menginstal Bootstrap untuk styling yang lebih baik. Tambahkan CDN Bootstrap di <head> setiap view.
7. Menguji Aplikasi CRUD Laravel 9 Anda: Verifikasi Fungsionalitas
Setelah semua langkah di atas selesai, saatnya menguji aplikasi CRUD Anda. Jalankan server development Laravel dengan perintah:
php artisan serve
Buka browser Anda dan kunjungi http://localhost:8000/products. Anda seharusnya melihat daftar produk (jika ada). Anda juga dapat mencoba menambahkan produk baru, mengedit produk yang ada, dan menghapus produk.
8. Validasi Data: Memastikan Integritas Data dalam CRUD Laravel 9
Validasi data adalah bagian penting dalam cara membuat CRUD dengan Laravel 9 untuk memastikan integritas data. Laravel menyediakan fitur validasi yang kuat dan mudah digunakan. Pada contoh controller di atas, kita sudah menggunakan validasi dalam method store() dan update():
$request->validate([
'nama' => 'required',
'deskripsi' => 'required',
'harga' => 'required|numeric',
]);
Kode ini akan memastikan bahwa field nama, deskripsi, dan harga harus diisi. Selain itu, field harga juga harus berupa angka. Jika validasi gagal, Laravel akan secara otomatis mengarahkan kembali pengguna ke halaman sebelumnya dengan pesan error.
Anda dapat menambahkan aturan validasi lainnya sesuai dengan kebutuhan Anda. Misalnya, Anda dapat membatasi panjang string, memeriksa format email, atau memastikan bahwa nilai tertentu unik dalam database. Lihat dokumentasi Laravel untuk daftar lengkap aturan validasi yang tersedia.
9. Menggunakan Resource Controllers: Simplifikasi Pengembangan CRUD Laravel 9
Laravel menyediakan Resource Controllers untuk menyederhanakan pengembangan CRUD. ProductController yang kita buat di atas sebenarnya adalah contoh dari resource controller. Dengan menggunakan resource controller, Anda mendapatkan semua method CRUD dasar (index, create, store, show, edit, update, destroy) secara otomatis.
Keuntungan menggunakan resource controller:
- Kode lebih terstruktur dan mudah dibaca.
- Mempercepat proses pengembangan.
- Mengikuti konvensi Laravel.
10. Opsi Lanjutan: Relasi Database dan Query yang Kompleks dalam CRUD Laravel 9
Cara membuat CRUD dengan Laravel 9 tidak hanya sebatas operasi dasar. Anda juga dapat mengimplementasikan relasi database dan query yang lebih kompleks.
Relasi Database:
Misalkan tabel products memiliki relasi dengan tabel categories. Anda dapat mendefinisikan relasi ini di model Product:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
protected $fillable = [
'nama',
'deskripsi',
'harga',
'category_id', // Tambahkan kolom category_id
];
public function category()
{
return $this->belongsTo(Category::class); // Mendefinisikan relasi belongsTo ke model Category
}
}
Kemudian, Anda dapat mengakses data kategori dari produk:
$product = Product::find(1);
echo $product->category->nama; // Menampilkan nama kategori produk
Query yang Kompleks:
Eloquent ORM memungkinkan Anda membuat query yang kompleks dengan mudah. Misalnya, Anda dapat mencari produk berdasarkan nama dan harga:
$products = Product::where('nama', 'like', '%keyword%')
->where('harga', '>', 100)
->get();
Anda juga dapat menggunakan query builder untuk membuat query yang lebih kompleks.
11. Keamanan dalam Implementasi CRUD: Proteksi Aplikasi Laravel 9
Keamanan adalah aspek penting dalam cara membuat CRUD dengan Laravel 9. Beberapa hal yang perlu diperhatikan untuk mengamankan aplikasi CRUD Anda:
- Validasi Input: Selalu validasi input pengguna untuk mencegah SQL injection dan serangan lainnya.
- Otorisasi: Pastikan hanya pengguna yang berwenang yang dapat mengakses dan memodifikasi data. Gunakan middleware otorisasi Laravel untuk membatasi akses ke routes tertentu.
- CSRF Protection: Laravel menyediakan CSRF (Cross-Site Request Forgery) protection secara default. Pastikan Anda menggunakan
@csrfdi semua formulir Anda. - XSS Protection: Hindari menampilkan data pengguna yang tidak di-escape untuk mencegah XSS (Cross-Site Scripting) attacks. Gunakan fungsi
{{ }}di Blade untuk secara otomatis melakukan escaping.
12. Kesimpulan: Menguasai CRUD dengan Laravel 9
Selamat! Anda telah mempelajari cara membuat CRUD dengan Laravel 9 Indonesia secara lengkap. Dengan panduan ini, Anda dapat membangun aplikasi web yang interaktif dan dinamis. Jangan ragu untuk bereksperimen dan mempelajari fitur-fitur Laravel 9 lainnya untuk meningkatkan kemampuan pengembangan web Anda. Ingatlah untuk selalu memperhatikan keamanan dan validasi data untuk memastikan aplikasi Anda aman dan andal. Selamat berkarya!


