Laravel, mungkin kalian sudah tidak asing dengan kata Laravel, laravel sendiri merupakan salah satu framework terpopuler untuk bahasa pemrograman PHP dengan konsep MVC (Model, View, Controller). Laravel rilis pada bulan Juni 2011 yang dikembangkan pertama kali oleh Taylor Otwell, dan sampai sekarang udah masuk versi laravel 9.
Jadi kali ini saya mau membagikan cara sederhana bagaimana membuat CRUD (create, read, update dan delete) pada Laravel 9 dengan DBMS MySQL. Sebelumnya untuk menjalankan Laravel 9 kalian perlu menggunakan versi PHP 8.0 keatas, DBMS MySQL dan composer.
Membuat Project Laravel
Pertama kalian buat dulu project laravelnya dengan composer, caranya dengan mengetikkan perintah berikut pada CMD dan jangan lupa nyalakan juga koneksi internetnya juga ya
composer create-project laravel/laravel CRUD-MySQL
Silahkan tunggu sampai prosesnya selesai, kemudian buka folder project laravelnya
Membuat Model, Controller, Migration dan Factory Post
Setelah selesai membuat project Laravel selanjutnya kita membuat Model, Controller, Migration, Factory untuk Post
Untuk membuat Model, Controller, Migration, Factory dapat menggunakan perintah artisan Laravel caranya dengan membuka terminal/CMD pada folder project Laravel lalu ketik perintah berikut untuk membuanya sekaligus
php artisan make:model Post -a
Membuat Kolom Database Post dengan Migration
Sekarang kita membuat kolom pada table Posts pada migration, caranya kalian pergi ke folder database/migrations dan buka file migration post yang sudah dibuat sebelumnya. Ditempat saya nama migration nya 2022_05_16_235829_create_posts_table.php , nama ini bisa berbeda. Pada function up disini diisi dengan nama kolom yang ingin dibuat.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug');
$table->text('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
};
Membuat Isi Data Dummy pada Database pada Factory
Setelah membuat kolom, kita lanjutkan lagi untuk membuat data palsunya untuk mengisi database kita. Sekarang buka file PostFactory.php pada folder database/factories. Dapat kalian isi sebagai berikut.
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
*/
class PostFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'title' => $this->faker->sentence,
'slug' => $this->faker->slug,
'body' => $this->faker->paragraph,
];
}
}
Sekarang buka DatabaseSeeder.php pada folder database/seeders dan bisa disesuaikan dengan code berikut
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// membuat 10 post
\App\Models\Post::factory(10)->create();
}
}
Mengatur Koneksi Database
Sebelumnya kalian buat terlebih dahulu database yang akan digunakan, bisa menggunakan PHPMyAdmin atau yang lain dengan nama laravel_crud_mysql. Dan untuk mengatur koneksi database buka file .env yang ada di folder utama project lalu atur host, port, nama database, username dan password.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_crud_mysql
DB_USERNAME=root
DB_PASSWORD=
Migration Ke Database Sekaligus dengan Data Dummy
Sekarang saatnya kita melakukan migration data ke database sekaligus dengan data dummy, caranya kita menggunakan perintah artisan berikut
php artisan migrate:fresh –seed
Setelah selesai maka table, kolom dan data dummy akan tesimpan pada database kita.
Post Model
Selanjutnya kita coding bagian model Post nya, masuk terlebih dahulu pada Post.php di folder app/Models , dibawah use HasFactory; tambahkan protected $guarded = [] ini fungsinya untuk menerima semua request yang akan dikirim ke database.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $guarded = [];
}
Request
Sekarang kita bikin Requestnya dulu, request disini berfungsi untuk validasi form sebelum dimasukkan ke database. Coba buka file request pada app/Http/Requests, nah disitu ada 2 file yaitu awalan Store dan Update. Sekarang buka file StorePostRequest lalu sesuaikan dengan code berikut.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'title' => 'required|string|max:255',
'slug' => 'required|string|max:255|unique:posts',
'body' => 'required|string|max:255',
];
}
}
Buka lagi UpdateStorePost dan sesuaikan dengan code berikut ini
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdatePostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'title' => 'required|string|max:255',
'slug' => 'required|string|max:255|unique:posts,slug,' . $this->post->id,
'body' => 'required|string|max:255',
];
}
}
PostController Controller
Lanjut kita coding PostController, silahkan buka filenya pada folder app/Http/Controllers lalu coding sebagai berikut
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$posts = Post::all();
return view('posts.index', compact('posts'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('posts.create');
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\StorePostRequest $request
* @return \Illuminate\Http\Response
*/
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post)->with('success', 'Post created successfully');
}
/**
* Display the specified resource.
*
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
*/
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
*/
public function edit(Post $post)
{
return view('posts.edit', compact('post'));
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\UpdatePostRequest $request
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
*/
public function update(UpdatePostRequest $request, Post $post)
{
$post->update($request->validated());
return redirect()->route('posts.show', $post)->with('success', 'Post updated successfully');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
*/
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('posts.index')->with('success', 'Post deleted successfully');
}
}
Silahkan disesuaikan ya, penjelasan sedikit fungsi index untuk menampilkan halaman semua data post, fungsi create menampilkan halaman form membuat post, fungsi store untuk insert data ke database, fungsi show untuk menampilkan post sesuai id post, fungsi update untuk mengubah data post yang akan diedit, fungsi edit untuk menampilkan halan form edit post, dan terakhir fungsi destroy untuk menghapus data sesusai dengan id post.
Membuat View
View disini merupakan code tampilan yang berika kombinasi blade Laravel, html, css, javascript. Pada view kita bikin dengan template Bootstrap saja. Sekarang coba kalian buat folder posts pada folder resource/views/ kemudian bikin 4 file pada folder resource/views/posts dengan nama index.blade.php yang digunakan untuk menampilkan semua data post, create.blade.php digunakan untuk menampilkan form tambah post, edit.blade.php digunakan untuk membuat tampilan edit data, show.blade.php digunakan untuk menampilkan data tertentu yang dipilih. Silahkan sesuaikan dengan code berikut ya.
create.blade.php
<!doctype html>
<html lang="en">
<head>
<title>Title</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS v5.0.2 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Posts</h1>
<a href="{{ route('posts.index') }}" class="btn btn-primary my-2">Back</a>
{{-- form create data --}}
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" id="title" name="title" value="{{ old('title') }}">
@error('title')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label for="title">Slug</label>
<input type="text" class="form-control" id="slug" name="slug" value="{{ old('slug') }}">
@error('slug')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label for="body">Body</label>
<textarea class="form-control" id="body" name="body" rows="3">{{ old('body') }}</textarea>
@error('body')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<button type="submit" class="btn btn-primary mt-3">Submit</button>
</form>
</div>
</div>
</div>
<!-- Bootstrap JavaScript Libraries -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous">
</script>
</body>
</html>
edit.blade.php
body>
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Posts</h1>
<a href="{{ route('posts.index') }}" class="btn btn-primary my-2">Back</a>
{{-- from update --}}
<form action="{{ route('posts.update', $post->id) }}" method="POST">
@csrf
@method('PUT')
<div class="form-group">
<label for="title">Title</label>
<input type="text" class="form-control" id="title" name="title"
value="{{ old('title', $post->title) }}">
@error('title')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label for="slug">Slug</label>
<input type="text" class="form-control" id="slug" name="slug"
value="{{ old('slug', $post->slug) }}">
@error('slug')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label for="body">Body</label>
<textarea class="form-control" id="body" name="body" rows="3">{{ old('body', $post->body) }}</textarea>
@error('body')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<button type="submit" class="btn btn-primary mt-3">Submit</button>
</form>
</div>
</div>
<!-- Bootstrap JavaScript Libraries -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous">
</script>
</body>
</html>
index.blade.php
<!doctype html>
<html lang="en">
<head>
<title>Title</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS v5.0.2 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
@if (session('success'))
<div class="alert alert-success mt-3">
{{ session('success') }}
</div>
@endif
<div class="col-md-12">
<h1>Posts</h1>
<a href="{{ route('posts.create') }}" class="btn btn-primary">Create</a>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Body</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach ($posts as $post)
<tr>
<td>{{ $post->id }}</td>
<td>{{ $post->title }}</td>
<td>{{ $post->body }}</td>
<td>
<a href="{{ route('posts.show', $post->id) }}" class="btn btn-primary">Show</a>
<a href="{{ route('posts.edit', $post->id) }}" class="btn btn-primary">Edit</a>
<form action="{{ route('posts.destroy', $post->id) }}" method="POST"
style="display: inline-block;">
@csrf
@method('DELETE')
{{-- ONCLICK submit alert --}}
<button type="submit" class="btn btn-danger"
onclick="return confirm('Are you sure?')">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Bootstrap JavaScript Libraries -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous">
</script>
</body>
</html>
show.blade.php
<!doctype html>
<html lang="en">
<head>
<title>Title</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS v5.0.2 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>
<div class="container">
@if (session('success'))
<div class="alert alert-success mt-3">
{{ session('success') }}
</div>
@endif
<div class="row">
<div class="col-md-12">
<h1>Posts</h1>
<a href="{{ route('posts.index') }}" class="btn btn-primary my-2">Back</a>
{{-- show data --}}
<div class="card">
<div class="card-header">
<h3>{{ $post->title }}</h3>
</div>
<div class="card-body">
<p>{{ $post->slug }}</p>
<p>{{ $post->body }}</p>
</div>
</div>
</div>
</div>
</div>
<!-- Bootstrap JavaScript Libraries -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous">
</script>
</body>
</html>
Route
Terakhir kita bikin route yang fungsi controller yang kita bikin dapat diakses lewat url. Caranya masuk ke folder routes dan masuk ke file web.php lalu tambahkan
Route::resource('posts', PostController::class);
Code tersebut berfungsi secara otomatis mengakses fungsi di controller kita, dan jangan lupa import PostController nya juga. Code lengkapnya dapat dilihat sebagai berikut
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
/*
|--------------------------------------------------------------------------
| 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('posts', PostController::class);
Running App
Sekarang coba kita coba running project Laravel kita, silahkan buka terminal dan ketik php artisan serve. Buka dibrowser lalu buka url http://127.0.0.1:8000/posts maka tampikan akan sebagi berikut
Full code dapat dilihat disini ya https://github.com/padhilahm/Laravel-9-CRUD-MySQL
Terimakasih yang udah berkunjung, kalau ada yang perlu ditanyaan isi kolom komentar
Comments (1)
Irfan
2 years agoMantab, makasih tutorial nya
Reply Cancel