PWPB | Laravel [ Create Data With DB FACADE ]
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
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 anda. Misal: 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
3. Langkah Ketiga
Buka file SiswaController.php dan buat method create untuk meampilkan view form. Untuk contoh bisa diliat dibawah ini
4. Langkah Keempat
Buat file form-siswa di folder form, untuk kodingannya bisa dilihat di bawah ini
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> 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
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> 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> 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.
0 Comments