Tutorial Laravel, Inertia.js & React.js #5 : Insert Data ke Database


Tutorial Laravel, Inertia.js & React.js #5 : Insert Data ke Database

Halo teman-teman semuanya, pada artikel sebelumnya kita telah belajar bagaimana cara menampilkan data di React.js menggunakan Inertia.js dan sekarang kita akan lanjutkan belajar bagaimana cara melakukan proses insert data ke dalam database di React.js.

Karena kita menggunakan Inertia.js, maka kita tidak perlu repot-repot membuat Rest API untuk bertukar data antara backend dan frontend, karena kita akan dimudahkan menggunakan adapter dari Inertia.js.

Langkah 1 - Menambahkan Method Create dan Store

Langkah pertama yang harus kita lakukan adalah menambahkan 2 method baru di dalam controller, dimana kedua method tersebut nantinya akan kita gunakan untuk menampilkan halaman form dan memproses data yang akan disimpan.

Silahkan buka file app/Http/Controllers/PostController.php, kemudian ubah kode-nya menjadi seperti berikut ini.

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

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

        //return view
        return inertia('Posts/Index', [
            'posts' => $posts
        ]);
    }
    
    /**
     * create
     *
     * @return void
     */
    public function create()
    {
        return inertia('Posts/Create');
    }
    
    /**
     * store
     *
     * @param  mixed $request
     * @return void
     */
    public function store(Request $request)
    {
        //set validation
        $request->validate([
            'title'   => 'required',
            'content' => 'required',
        ]);

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

        //redirect
        return redirect()->route('posts.index')->with('success', 'Data Berhasil Disimpan!');
    }
}

Dari perubahan kode di atas, kita menambahkan 2 method baru, yaitu :

  1. function create - digunakan untuk menampilkan halaman form tambah data.
  2. function store - digunakan untuk memproses data yang dikirimkan dan menyimpannya ke dalam database.

Function Create

Method ini akan kita gunakan untuk menampilkan halaman form tambah data, dimana di dalamnya kita melakukan return ke dalam view Create.

return inertia('Posts/Create');

Function Store

Method ini akan digunakan untuk memproses data yang dikirim oleh form untuk disimpan ke dalam database. Tapi sebelum data tersebut disimpan, maka akan dilakukan pengecekan validasi terlebih dahulu.

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

Dari penambahan validasi di atas, kurang lebih seperti berikut ini penjelasannya.

KEY VALIDATION DESCRIPTION
title required field wajib diisi.
content required field wajib diisi.

Jika data yang dikirimkan sudah sesuai dengan validasi di atas, maka kita lanjutkan melakukan proses insert data ke dalam database menggunakan Model.

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

kemudian kita redirect ke dalam route yang bernama posts.index dengan menambahkan pesan sukses.

//redirect
return redirect()->route('posts.index')->with('success', 'Data Berhasil Disimpan!');

Langkah 2 - Membuat View Tambah Data

Setelah method di dalam controller berhasil ditambahkan, kita lanjutkan membuat view untuk menampilkan halaman tambah data.

Silahkan buat file baru dengan nama Create.jsx di dalam folder resources/js/Pages/Posts, kemudian masukkan kode berikut ini di dalamnya.

//import hook useState from react
import React, { useState } from 'react';

//import layout
import Layout from '../../Layouts/Default';

//import inertia adapter
import { Inertia } from '@inertiajs/inertia';

export default function CreatePost({ errors }) {

    //define state
    const [title, setTitle] = useState('');
    const [content, setContent] = useState('');

    //function "storePost"
    const storePost = async (e) => {
        e.preventDefault();
        
        Inertia.post('/posts', {
            title: title,
            content: content
        });
    }

    return (
        <Layout>
            <div className="row" style={{ marginTop: '100px' }}>
                <div className="col-12">
                    <div className="card border-0 rounded shadow-sm border-top-success">
                        <div className="card-header">
                            <span className="font-weight-bold">TAMBAH POST</span>
                        </div>
                        <div className="card-body">
                            <form onSubmit={storePost}>

                                <div className="mb-3">
                                    <label className="form-label fw-bold">Title</label>
                                    <input type="text" className="form-control" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Masukkan Judul Post" />
                                </div>
                                {errors.title && (
                                    <div className="alert alert-danger">
                                        {errors.title}
                                    </div>
                                )}

                                <div className="mb-3">
                                    <label className="form-label fw-bold">Content</label>
                                    <textarea className="form-control" value={content} onChange={(e) => setContent(e.target.value)} placeholder="Masukkan Judul Post" rows={4}></textarea>
                                </div>
                                {errors.content && (
                                    <div className="alert alert-danger">
                                        {errors.content}
                                    </div>
                                )}

                                <div>
                                    <button type="submit" className="btn btn-md btn-success me-2"><i className="fa fa-save"></i> SAVE</button>
                                    <button type="reset" className="btn btn-md btn-warning"><i className="fa fa-redo"></i> RESET</button>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </Layout>
    )
}

Dari penambahan kode di atas, pertama kita import React dan hook useState, karena kita akan gunakan untuk membuat state nantinya.

//import hook useState from react
import React, { useState } from 'react';

kemudian kita import layout.

//import layout
import Layout from '../../Layouts/Default';

Dan terakhir kita import adapter dari Inertia.js.

//import inertia adapter
import { Inertia } from '@inertiajs/inertia';

Di dalam function component CreatePost kita menambahkan parameter errors. Parameter tersebut merupakan props yang dikirimkan oleh controller ketika form validasi tidak terpenuhi.

export default function CreatePost({ errors }) {

	//...
	
}

Di dalam function component CreatePost kita membuat 2 state baru. State ini yang akan digunakan untuk menyimpan data yang diketikkan di input form.

//define state
const [title, setTitle] = useState('');
const [content, setContent] = useState('');

Setelah itu, kita buat method baru dengan nama storePost, method tersebut akan dijalankan ketia form disubmit.

<form onSubmit={storePost}>

	//...
	
</form>
//function "storePost"
const storePost = async (e) => {

	//...
	
}

Di dalam method tersebut, kita melakukan Http request ke server untuk mengirim data title dan content untuk disimpan ke dalam database.

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

Untuk menangkap input data, kita menggunakan onChange dan kita lakukan setState agar value-nya dimasukkan ke dalam state.

<input type="text" className="form-control" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Masukkan Judul Post" />

Dan untuk menampilkan error validasi, kita menggunakan kode seperti berikut ini.

{errors.title && (
    <div className="alert alert-danger">
        {errors.title}
    </div>
)}

Langkah 3 - Uji Coba Insert Data Post

INFORMASI PENTING : pastikan teman-teman sudah menjalankan perintah npm run dev. Dan jangan ditutup terminal/CMD-nya.

Silahkan klik button TAMBAH POST yang ada pada halaman posts index, jika berhasil maka akan mendapatkan hasil seperti berikut ini.

Silahkan klik SAVE tanpa mengisi data apapun, maka kita akan mendapatkan error validasi kurang lebih seperti berikut ini.

Dan sekarang, silahkan masukkan data di dalam title dan content, kemudian klik SAVE, jika berhasil maka hasilnya seperti berikut ini.

Sampai disini pembahasan kita bagaimana cara membuat proses insert data ke dalam database di React.js menggunakan Inertia.js.

Pada artikel selanjutnya kita semua akan belajar bagaimana cara membuat proses edit dan update data ke dalam database di dalam React.js menggunakan Inertia.js.

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