Tutorial Laravel & Inertia.js #6 : Insert Data ke Database


Tutorial Laravel & Inertia.js #6 : Insert Data ke Database

Halo teman-teman semuanya, di artikel sebelumnya kita sudah belajar bagaimana cara menampilkan data dari database dan pada kesempatan kali ini kita semua akan belajar bagaimana cara memasukkan atau insert data ke dalam database.

Dengan menggunakan Inertia.js kita tentu tidak perlu membuat sebuah Rest API untuk bertukar data antara controller dan frontend, kita cukup membuat kode yang sama seperti pada umunya dan kita tinggal render menggunakan adapter dari Inertia.js.

Langkah 1 - Membuat Method Create dan Store

Pertama, kita akan membuat 2 method baru di dalam controller PostController, yaitu :

  • function create - method ini akan kita gunakan untuk melakukan render sebuah form untuk proses insert data.
  • function store - method ini akan digunakan untuk memperoses data yang dikirim dari form dan di akan di insert ke dalam database.

Silahkan buka file app/Http/Controllers/PostController.php dan ubah semua kode-nya menjadi seperti berikut ini :

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Inertia\Inertia;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;

class PostController extends Controller
{    
    /**
     * index
     *
     * @return void
     */
    public function index()
    {
        //get all posts from database
        $posts = Post::latest()->get();

        //render with data "posts"
        return Inertia::render('Post/Index', [
            'posts' => $posts
        ]);
    }

    /**
     * create
     *
     * @return void
     */
    public function create()
    {
        return Inertia::render('Post/Create');
    }
    
    /**
     * store
     *
     * @param  mixed $request
     * @return void
     */
    public function store(Request $request)
    {
        //set validation
        $request->validate([
            'title'   => 'required',
            'content' => 'required',
        ]);

        //create post
        $post = Post::create([
            'title'     => $request->title,
            'content'   => $request->content
        ]);

        if($post) {
            return Redirect::route('posts.index')->with('message', 'Data Berhasil Disimpan!');
        }
    }
}

Dari perubahan kode di atas, pertama kita melakukan import Http Request dari Laravel, ini akan kita gunakan untuk menerima sebuah request yang dikirim dari form, url, cookie dan lain-lain.

use Illuminate\Http\Request;

Selanjutnya, kita juga melakukan import Facades Redirect, ini akan kita gunakan untuk melakukan redirect ke dalam sebuah route atau url tertentu.

use Illuminate\Support\Facades\Redirect;

Function Create

Method ini akan digunakan untuk melakukan render sebuah halaman form untuk melakukan input data.

return Inertia::render('Post/Create');

Function Store

Method ini akan kita gunakan untuk melakukan proses insert data yang dikirim dari form ke dalam database, disini pertama kita lakukan sebuah pengecekan valiasi terlebih dahulu, dimana digunakan untuk memastikan apakah data yang akan di insert sudah benar-benar sesuai atau belum.

//set validation
$request->validate([
   'title'   => 'required',
   'content' => 'required',
]);

Jika data yang dikirim sudah sesuai, maka kita akan melakukan proses insert menggunakan Model Eloquent, kurang lebih seperti berikut ini :

//create post
$post = Post::create([
   'title'     => $request->title,
   'content'   => $request->content
]);

Setelah itu, kita lakukan sebuah kondisi untuk memastikan apakah proses insert data di atas berhasil atau tidak, jika berhasil maka kita akan lakukan redirect ke dalam route yang bernama posts.index dan kita berikan sebuah flash message juga.

if($post) {
    return Redirect::route('posts.index')->with('message', 'Data Berhasil Disimpan!');
}

Langkah 2 - Membuat View Tambah Data

Sekarang kita tinggal lanjutkan untuk menambahkan sebuah view baru untuk menampilkan halaman form, silahkan buat file baru dengan nama Create.vue di dalam folder resources/js/Pages/Post/ dan masukkan kode berikut ini :

<template>

    <div>
        <div class="card border-0 rounded shadow">
            <div class="card-body">
                <h4>TAMBAH POST</h4>
                <hr>
                <form @submit.prevent="storePost">
                    <div class="mb-3">
                        <label class="form-label">TITLE POST</label>
                        <input type="text" class="form-control" v-model="post.title" placeholder="Masukkan Title Post">
                        <div v-if="errors.title" class="mt-2 alert alert-danger">
                            {{ errors.title }}
                        </div>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">CONTENT</label>
                        <textarea class="form-control" rows="5" v-model="post.content" placeholder="Masukkan Content Post"></textarea>
                        <div v-if="errors.content" class="mt-2 alert alert-danger">
                            {{ errors.content }}
                        </div>
                    </div>
                    <div class="mb-3">
                        <button type="submit" class="btn btn-primary btn-md shadow-sm me-2">SIMPAN</button>
                        <button type="reset" class="btn btn-warning btn-md shadow-sm">RESET</button>
                    </div>
                </form>
            </div>
        </div>
    </div>

</template>

<script>
    //import layout
    import LayoutApp from '../../Layouts/App.vue'

    import { reactive } from 'vue'
    import { Inertia } from '@inertiajs/inertia'

    export default {

        //layout
        layout: LayoutApp,

        //props
        props: {
            errors: Object
        },

        //define Composition Api
        setup() {

            //state posts
            const post = reactive({
                title: '',
                content: ''
            })

            //function storePost
            function storePost() {
                
                //define variable 
                let title   = post.title
                let content = post.content

                //send data
                Inertia.post('/posts/', {
                    title: title,
                    content: content
                })
             
            }

            return {
                post,
                storePost
            }

        }
    }
</script>

Dari penambahan kode di atas, pertama kita import Layout terlebih dahulu.

//import layout
import LayoutApp from '../../Layouts/App.vue

kemudian kita import Reactivity API dari Vue.js yaitu reactive, ini akan digunakan untuk membuat sebuah state secara realtime di dalam Composition API.

import { reactive } from 'vue'

Setelah itu, kita import Inertia dari apater Inertia.js, ini akan kita gunakan untuk melakukan http request ke route Laravel, jadi kita tidak perlu menggunakan library tambahan seperti Axios.

import { Inertia } from '@inertiajs/inertia'

Kemudian kita register Layout di atas ke dalam properti layout.

//layout
layout: LayoutApp,

Dan untuk handle error validasi dari controller, kita melakukan definisi sebuah props dengan nama errors dan mempunyai jenis Object.

//props
props: {
  errors: Object
},

Dan untuk mendefinisikan Composition API, maka kita perlu menggunakan method yang bernama setup.

setup() {

	//...

}

Dan di dalam Composition API, pertama kita membuat sebuah state yang bernama post dan state ini menggunakan Reactivity API yaitu reactive.

//state posts
const post = reactive({
    title: '',
    content: ''
})

Kemudian kita membuat sebuah function yang bernama storePost, fungsi ini akan dijalankan ketika pengguna melakukan submit form.

//function storePost
function storePost() {

	//...

}

Di dalam function tersebut kita mendefinisikan sebuah variable, yaitu title dan content. Dimana kedua variable tersebut berisi state yang sudah kita buat di atas, yaitu post.

//define variable 
let title   = post.title
let content = post.content

Kemudian kita akan kirim kedua variable tersebut ke dalam controller PostController dan method store untuk dilakukan proses insert data ke dalam database.

//send data
Inertia.post('/posts/', {
    title: title,
    content: content
})

Di atas kita menggunakan adapter dari Inertia untuk melakukan proses Http Request ke dalam controller.

Dan agar state dan function yang ada di dalam Composition API dapat digunakan di dalam template, maka kita perlu melakukan return terlebih dahulu.

return {
   post,		// <-- state "post"
   storePost	// <-- function "storePost"
}

Langkah 3 - Compiling Assets dan Menjalankan Project

Agar semua perubahan yang ada di dalam folder resources/js dapat diperbarui, maka kita perlu melakukan compiling assets lagi menggunakan Laravel MIX, silahkan jalankan perintah berikut ini di dalam terminal/CMD :

npm run dev

Silahkan di tunggu proses compiling sampai selesai, jika sudak silahkan klik button TAMBAH DATA atau bisa klik link http://localhost:8000/posts/create dan jika berhasil maka kurang lebih tampilannya seperti berikut ini :

Silahkan klik SIMPAN tanpa perlu mengisi data apapun dan jika berhasil maka kita akan mendapatkan sebuah error validasi kurang lebih seperti berikut ini :

Dan sekarang silahkan isi data title dan content sesuai dengan keinginan masing-masing dan kemudian klik button SIMPAN, jika berhasil maka kita akan diarahkan ke halaman index post dan menampilkan pesan sukses.

Sampai disini pembahasan bagaimana cara membuat fitur insert data di dalam Inertia.js dan Laravel, di artikel selanjutnya kita semua akan belajar bagaimana cara membuat proses edit dan update data ke dalam database.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami