Create Data With DB FACADE in Laravel


           Assalamualaikum wr wb, pada blog kali ini saya akan memberikan atau lebih jelasnya menjelaskan materi Laravel kembali mengenai Creade Data menggunakan DB Facade. Pada blog sebelumnya kita sudah memperlajari controller yang nantinya juga berguna untuk materi materi laravel selanjutnya. Okee langsung saja ke materinya, sebelum itu siapkan dulu seperti biasa text editor, xampp, dan browser. Langsung saja ikuti langkah - langkah di bawah ini.

A. Create Data

1. Langkah Pertama 

Buka file belajar.blade.php dan tambahkan link untuk menuju ke halaman form, untuk contoh bisa diliat di bawah ini

<a href="{{ url('create-siswa') }}"><i class="fas fa-user-plus fa-2x mt-2"></i></a>

Penjelasan : 
URL digunakan untuk menciptakan URL menuju url tertentu. URL yang diciptakan akan ditambahkan base_url dari project andaMisal: url(‘/siswa/create’), maka yang akan muncul di HTML nya adalah http://localhost/laravel5.7-fresh/public/belajar/create.

2. Langkah Kedua 

Buka file web.php di file routes lalu tambahkan kodingan di bawah ini

Route::get('/create-siswa','SiswaController@create')->name('create');

3. Langkah Ketiga

Buka file SiswaController.php dan buat method create untuk meampilkan view form. Untuk contoh bisa diliat dibawah ini

public function create() {
        return view('form.form-siswa');
}

4. Langkah Keempat

Buat file form-siswa di folder form, untuk kodingannya bisa dilihat di bawah ini

<form action="{{ url('data-siswa') }}" method="POST">
            @csrf
                <div class="form-group">
                    <label for="nis" class="text-dark">NIS</label>
                    <input type="text" class="form-control" id="nis" name="nis">
                </div>
                <div class="form-group">
                    <label for="nama_lengkap" class="text-dark">Nama Lengkap</label>
                    <input type="text" class="form-control" id="nama_lengkap" name="nama_lengkap">
                </div>
                <div class="form-group">
                    <label class="text-dark">Jenis Kelamin</label>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminL" name="jenis_kelamin" class="custom-control-input" value="L">
                        <label class="custom-control-label text-dark" for="jenis_kelaminL">Laki - Laki</label>
                    </div>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminP" name="jenis_kelamin" class="custom-control-input" value="P">
                        <label class="custom-control-label text-dark" for="jenis_kelaminP">Perempuan</label>
                    </div>
                </div>
                <div class="form-grup">
                    <label class="text-dark">Golongan Darah</label>
                    <select class="custom-select" name="golongan_darah">
                        <option disabled selected>[ Select Golongan Darah ]</option>
                        <option value="A" >A</option>
                        <option value="AB">AB</option>
                        <option value="B" >B</option>
                        <option value="O" >O</option>
                    </select>
                </div>
                <input type="submit" value="Simpan" class="btn btn-success mt-3" style="width:80px;">
                <a href="{{ route('siswa') }}" class="btn btn-secondary mt-3" style="width:80px;">Back</a>
            </form>

Penjelasan CSRF :

- crsf
   CSRF (Cross-Site Request Forgery) merupakan bentuk eksploitasi website yang dieksekusi atas wewenang korban, tanpa dikehendakinya. CSRF menipu web site melalui request dari user yang dipercaya. Serangan bekerja melalui link atau script pada halaman site yang diakses user.

- crsf_token()
   digunakan untuk membuat csrf token

- csrf_field()
   Digunakan untuk membuat input hidden _token beserta token nya

5. Langkah Kelima

Tambahkan route post

Route::post('/data-siswa','SiswaController@store');

untuk mengarahkan route /data-siswa dengan method request POST ke function store pada controller SiswaController

6. Langkah Keenam

Buka file SiswaController dan tambahkan fungsi store, untuk kodingan bisa dilihat di bawah ini

public function store(Request $request) {
        
        
        $input = $request->all();
        // Baris diatas digunakan untuk menangkap seluruh request yang dikirim dari view form

        unset($input['_token']);
        //Baris diatas digunakan untuk menghapus data dengan key _token pada array asosiatif $input karena data tersebut tidak ada didalam tabel (tidak akan di-insert)
        
        $status = \DB::table('t_siswa')->insert($input);
        // Melakukan insert data ke tabel t_siswa dimana datanya berasal dari array $input

        
        if ($status) {
            return redirect('/data-siswa')->with('success','Data Berhasil Ditambahkan');
        } else {
            return redirect('/create-siswa')->with('error','Data Gagal Ditambahkan');
        }
        // Baris diatas memeriksa apakah input data berhasil atau tidak.
        // Jika berhasil maka arahkan tampilan kembali ke alamat /siswa (Menampilkan Tabel Data Siswa) dengan membawa session success dengan pesan ‘Data berhasil ditambahkan’
        // Jika gagal maka arahkan tampilan kembali ke alamat /siswa/create (Menampilkan kembali form input data siswa) dengan membawa session error dengan pesan ‘Data gagal ditambahkan’

    }


Hasil

Coba buka di browser anda hasilnya, untuk contohnya bisa dilihat di bawah ini

a. mengisi form


b. jika berhasil maka data yang ditambahkan akan muncul



B. Success/Error Message Feedback 

buka file belajar.blade.php dan tammbahkan kodingan di bawah ini (letaknya disesuaikan)


@if(session('success'))
            <div class="alert alert-success">
                <i class="far fa-check-circle"></i>
                {{ session('success') }}
            </div>
        @endif
        @if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }} 
            </div>
        @endif


Penjelasan :

- if
Digunakan untuk menampilkan suatu bagian pada HTML ketika kondisi pada PHP terpenuhi
@if(session(‘success’))
Pada contoh diatas, tampilkan div dengan class success jika session(‘success’) tidak kosong. Div tersebut berisikan data/pesan yang ada pada session(‘success’) tersebut
Perhatikan penempatan blok @endif

Jika berhasil maka saat kita menambahkan data baru, message success/error akan muncul. Untuk Contoh Hasilnya jika berhasil bisa dilihat di bawah ini



C. Input Validation     


Untuk melakukan validasi input agar sesuai dengan yang diharapkan, Laravel sudah menyediakan fiturnya yaitu dengan menggunakan Facades Validator atau function validate.


Buka file SiswaController dan tambahkan kodingan di bawah ini ke dalam fungsi store

$rule = [
            'nis' => 'required|numeric',
            'nama_lengkap' => 'required|string',
            'jenis_kelamin' => 'required',
            'golongan_darah' => 'required',
        ];
        $this->validate($request$rule);

Buka file form-siswa dan tambahkan kodingan di bawah ini

@if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }}
            </div>
        @endif

        @if (count($errors) > 0)
            <div class="alert alert-danger">                
                <strong><i class="fas fa-exclamation-triangle text-warning"></i>&nbsp;Perhatian</strong>
                <br>
                <ul>
                    @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif

Penjelasan :

Cara menulis rule adalah dengan membuat array asosiatif yang didalamnya berisi key yang berupa nama field yang ada pada form dan value yang berisi string valiadasinya.

Jika terdapat lebih dari 2 validasi, gunakan simbol |
Jika string validasi memerlukan parameter, gunakan simbol titik dua :
Contoh Array Asosiatif untuk Validasi NIS:
‘nis’ => ‘max:10’
Artinya: Validasi NIS hanya boleh memiliki panjang maksimal 10 karakter

Hasilnya

Jika ada field yang tidak di isi, maka akan muncul pesan error, untuk contoh bisa dilihat di bawah ini



D. Displaying USER’S OLD Value


Ketika form tidak lengkap atau tidak sesuai dengan rules, seharusnya form yang sudah diisi oleh user yang sebelumnya harus tetap muncul. Untuk menambahkan fungsi old ini buka file form-siswa dan tambahkan kodingan di bawah ini (sebagai contoh)


value="{{ old('nis') }}"

Hasilnya

- Sebelum menggunakan fungsi old, field akan kembali kosong padahal data pernah diisi


- Sesudah menggunakan fungsi old, field akan mengambil data yang sebelumnya


E. Studi Kasus  

1. Lakukan hal yang sama seperti yang sudah dijelaskan pada slide sebelumnya untuk tabel t_kelas. Buatlah tampilan form untuk menambahkan data kelas.

2.  Implementasikan validasi untuk tabel t_kelas, cobalah beberapa validasi yang berbeda selain yang sudah dijelaskan (tidak boleh validasi numeric, string dan max)

3. Di tutorial ini terdapat BUG, temukan BUG nya dan pecahkan solusi dari BUG tersebut!

4. Sudah menangkap maksud dari fungsi old? Implementasikan fungsi old untuk field berjenis radio button dan field berjenis select option pada form siswa (Field jenkel dan goldar)

a. Studi Kasus 1 dan 2

file view untuk tabel t_kelas, file kelas.blade.php

<center>
    <div class="card mt-5 mb-5" style="width:80%;">
        <div class="card-header">
            <div class="row">
                <h2 style="margin-left:260px; margin-right:235px;" class="text-info">Daftar Profile Kelas di SMK Negeri 4 Bandung</h2>
                <a href="{{ url('create-kelas') }}"><i class="fas fa-plus-square fa-2x mt-2"></i></a>
            </div>
        </div>
        <div class="card-body">
            <div class="table-responsive">
                <table class="table table-bordered text-center" id="dataTable" border="1" cellspacing="0" cellpadding="10" width="100%">
                    <thead>
                        <tr class="text-dark">
                            <th>No</th>
                            <th>Nama Kelas</th>
                            <th>Jurusan</th>
                            <th>Lokasi Lab Jurusan</th>
                            <th>Wali Kelas</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    @foreach ($kelas as $row) 
                    <tr>
                        <td>{{$loop->iteration}}</td>                        
                        <td>{{$row->nama_kelas}}</td>
                        <td>{{$row->jurusan}}</td>
                        <td>{{$row->lokasi_lab}}</td>
                        <td>{{$row->nama_wali_kelas}}</td>
                        <td>
                            <a href="" class="btn btn-warning" style="width:100px;" ><i class="fas fa-edit mr-1"></i>Edit</a>
                            <a href="" class="btn btn-danger" style="width:100px;" onclick="return confirm('Yakin akan menghapus data ini ?');"><i class="fas fa-trash-alt mr-1"></i>Delete</a>
                        </td>
                    </tr>
                    @endforeach
                </table>
            </div>
        </div>
    </div>
</center>


tambahkan kodingan di bawah ke file web.php ini untuk routes ke halaman form-kelas.blade.php

Route::get('/create-kelas','KelasController@create')->name('create-kelas');
Route::post('/data-kelas','KelasController@store');


file form-kelas untuk menambahkan data kelas

<div class="card" style="width:50%; margin:auto;">
        <div class="card-header">
            <h2 class="text-info">Tambah Data Siswa</h2>
        </div>
        <div class="card-body">
        @if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }} 
            </div>
        @endif

        @if (count($errors) > 0)
            <div class="alert alert-danger">                
                <strong><i class="fas fa-exclamation-triangle text-warning"></i>&nbsp;Perhatian</strong>
                <br>
                <ul>
                    @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
            <form action="{{ url('data-kelas') }}" method="POST">
            @csrf
                <div class="form-group">
                    <label for="nama_kelas" class="text-dark">Nama Kelas</label>
                    <input type="text" class="form-control" id="nama_kelas" name="nama_kelas" value="{{ old('nama_kelas') }}">
                </div>
                <div class="form-group">
                    <label for="jurusan" class="text-dark">Jurusan</label>
                    <input type="text" class="form-control" id="jurusan" name="jurusan" value="{{ old('jurusan') }}">
                </div>
                <div class="form-group">
                    <label for="lokasi_lab" class="text-dark">Lokasi Lab</label>
                    <input type="text" class="form-control" id="lokasi_lab" name="lokasi_lab" value="{{ old('lokasi_lab') }}">
                </div>
                <div class="form-group">
                    <label for="nama_wali_kelas" class="text-dark">Nama Wali Kelas</label>
                    <input type="text" class="form-control" id="nama_wali_kelas" name="nama_wali_kelas" value="{{ old('nama_wali_kelas') }}">
                </div>
                <input type="submit" value="Simpan" class="btn btn-success mt-3" style="width:80px;">
                <a href="{{ route('kelas') }}" class="btn btn-secondary mt-3" style="width:80px;">Back</a>
            </form>
        </div>
    </div>


file KelasController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class KelasController extends Controller
{
    public function index() {
        $data['kelas'] = \DB::table('t_kelas')->get();        
        return view('kelas',$data);
    }

    public function create() {
        return view('form.form-kelas');
    }

    public function store(Request $request) {
        
        $rule = [
            'nama_kelas' => 'bail|required|unique:t_kelas,nama_kelas',
            'jurusan' => 'required|string',
            'lokasi_lab' => 'required|string',
            'nama_wali_kelas' => 'required|string',
        ];
        $this->validate($request$rule);
        
        $input = $request->all();
        unset($input['_token']);
        $status = \DB::table('t_kelas')->insert($input);

        if ($status) {
            return redirect('/data-kelas')->with('success','Data Berhasil Ditambahkan');
        } else {
            return redirect('/create-kelas')->with('error','Data Gagal Ditambahkan');
        }
    }
}

penjelasan validasi :

- bail berfungsi untuk menghentikan validasi setelah kegagalan validasi pertama.
- unique berfungsi untuk membedakan data yang sudah diinput jadi tidak akan terjadi duplicate data


b. Studi Kasus 3 dan 4

untuk studi kasus ketiga dan keempat ini kita harus mencari tahu bug yang terdapat pada tutorial dan menambahkan fungsi old pada input type radio dan select . Oke saya akan memberitahu bug bug apa saja yang terdapat pada tutorial

- BUG : jika kita meninputkan data nis yang sama tidak akan terjadi duplicate entry. Karena kita membuat di databasenya untuk primrar key nya adalah id. Tetapi aturannya satu siswa itu memilki nis yang berbeda beda.

   Solusi : - mengubah stuktur database dan mengubah nis menjadi primary key
                - memberikan validasi "unique" agar tidak ada data yang sama

solusi yang saya pilih adalah solusi yang kedua yaitu menambahkan validasi unique. Untuk penulisan validasinya bisa dilihat di bawah ini

'nis' => 'required|numeric|unique:t_siswa,nis'


Untuk menbambahkan fungsi old pada input type radio dan select disini saya menambahkan ternary. Langsung saja ke kodingannya bisa dilihat di bawah ini

@extends('layouts.master')
@section('title','Data Siswa')
@section('siswa','active')
@section('content')
    <br><br><br>
    <div class="card" style="width:50%; margin:auto;">
        <div class="card-header">
            <h2 class="text-info">Tambah Data Siswa</h2>
        </div>
        <div class="card-body">
        @if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }}
            </div>
        @endif

        @if (count($errors) > 0)
            <div class="alert alert-danger">                
                <strong><i class="fas fa-exclamation-triangle text-warning"></i>&nbsp;Perhatian</strong>
                <br>
                <ul>
                    @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
            <form action="{{ url('data-siswa') }}" method="POST">
            @csrf
                <div class="form-group">
                    <label for="nis" class="text-dark">NIS</label>
                    <input type="text" class="form-control" id="nis" name="nis" value="{{ old('nis') }}">
                </div>
                <div class="form-group">
                    <label for="nama_lengkap" class="text-dark">Nama Lengkap</label>
                    <input type="text" class="form-control" id="nama_lengkap" name="nama_lengkap" value="{{ old('nama_lengkap') }}">
                </div>
                <div class="form-group">
                    <label class="text-dark">Jenis Kelamin</label>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminL" name="jenis_kelamin" class="custom-control-input" value="L" {{ old('jenis_kelamin')=='L' ? 'checked' : '' }}>
                        <label class="custom-control-label text-dark" for="jenis_kelaminL">Laki - Laki</label>
                    </div>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminP" name="jenis_kelamin" class="custom-control-input" value="P" {{ old('jenis_kelamin')=='P' ? 'checked' : '' }}>
                        <label class="custom-control-label text-dark" for="jenis_kelaminP">Perempuan</label>
                    </div>
                </div>
                <div class="form-grup">
                    <label class="text-dark">Golongan Darah</label>
                    <select class="custom-select" name="golongan_darah">
                        <option disabled selected>[ Select Golongan Darah ]</option>
                        <option value="A" {{ old('golongan_darah')=='A' ? 'selected' : '' }}>A</option>
                        <option value="AB" {{ old('golongan_darah')=='AB' ? 'selected' : '' }}>AB</option>
                        <option value="B" {{ old('golongan_darah')=='B' ? 'selected' : '' }}>B</option>
                        <option value="O" {{ old('golongan_darah')=='O' ? 'selected' : '' }}>O</option>
                    </select>
                </div>
                <input type="submit" value="Simpan" class="btn btn-success mt-3" style="width:80px;">
                <a href="{{ route('siswa') }}" class="btn btn-secondary mt-3" style="width:80px;">Back</a>
            </form>
        </div>
    </div>
@endsection


Jika sudah ditambahkan maka saat kita meng input data nis yang sama akan muncul pemberitahuan  dan fungsi old sudah berfungsi pada input type radio dan select seperti gambar di bawah ini





Cukup sekian materi yang dapat saya berikan mengenai create data dan validasi di Laravel. Semoga bermanfaat dan mohon maaf jika ada kesalahan. Wassalamualaikum wr wb.