• Banjarbaru, Kalimantan Selatan
08WqJVaAOjKfRqbhB3DtDmBxXPlsX6I1DJvSxUge.png
2 years ago

Tutorial Laravel 9 Membuat CRUD MySQL Sederhana

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

  • Model adalah bagian dari  MVC yang  berkomunikasi dengan database. Model yang sudah terhubung ke database akan digunakan/dipanggil melalui controller saat konsep MVC sedang berjalan.
  • Controller adalah salah satu komponen inti dari MVC dan bertindak sebagai penghubung antara request user (view) dan model yang kemudian dikembalikan ke View dalam bentuk respons.
  • Migration adalah fitur Laravel yang bertindak seperti pembuatan versi database. Fitur ini memungkinkan kita untuk mengelola dan memodifikasi skema database aplikasi.
  • Fungsi dari model factory adalah untuk mengisi tabel database dengan record. Kalian dapat menggunakan fungsi ini untuk memasukkan data  yang disediakan secara acak dan  jumlah yang dapat ditentukan sendiri ke dalam kolom tabel.

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)

client

Irfan

2 years ago

Mantab, makasih tutorial nya

Reply

Leave a Reply