MWI – CRUD adalah akronim untuk Create, Read, Update, dan Delete. Operasi CRUD adalah manipulasi data dasar untuk database. Dalam tutorial ini kita akan membuat aplikasi Perpustakaan untuk Tabel Buku menggunakan Framework Laravel versi 5.8, untuk melakukan semua operasi ini pada tabel database MySQL.
Daftar Isi
Kebutuhan Minimal
Sebelum kita mulai, untuk Framework Laravel 6.0 (versi terbaru saat tutorial ini ditulis), kebutuhan minimum dari aplikasi yang digunakan adalah:
- PHP >= 7.2.0
- BCMath PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
- Mbstring PHP Extension
- OpenSSL PHP Extension
- PDO PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
artinya versi PHP minimal 7.2.0 dengan extensi yang disebutkan dibawahnya harus sudah terinstall dan aktif.
Skema Database
Kita akan belajar CRUD (Create, Read, Update dan Delete) dengan data yang kita olah adalah data perpustakaan dengan 1 tabel untuk praktek kita. beri nama database pustaka dan tabel buku dan peminjam
Tabel: peminjam
No | Nama Field | Jenis | Ukuran | Keterangan |
1 | id | int | 10 | PK, AI |
2 | nama | varchar | 50 |
|
3 | kelas | varchar | 30 |
|
4 | jk | varchar | 1 |
|
5 | alamat | varchar | 255 |
|
6 | hp | varchar | 15 |
|
Tabel: buku
No | Nama Field | Jenis | Ukuran | Keterangan |
1 | id | int | 10 | Primary, AI |
2 | judul | varchar | 100 |
|
3 | pengarang | varchar | 50 |
|
4 | penerbit | varchar | 50 |
|
5 | tahun | varchar | 4 |
|
Install
Untuk instal dapat merujuk ke tutorial install laravel, atau gunakan composer create project, jika composer belum install install terlebih dahulu ikuti panduan ini
composer create-project --prefer-dist laravel/laravel pustaka
buat database bisa menggunakan phpmyadmin atau adminer, contoh disini kita menggunakan terminal (CLI – Command Prompt) untuk menjalankannya.
mysql -uroot -p
mysql> create database pustaka;
Query OK, 1 row affected (0.08 sec)
Keluar dengan perintah exit; atau tekan Ctrl + D.
Berikan hak akses penuh untuk user dan dan web dengan perintah
chmod 775 -R pustaka
sudo chown muhidin:www-data -R pustaka
Lanjutkan dengan edit file .env dan sesuaikan isinya:
cd pustaka
geany .env
-----------
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=pustaka
DB_USERNAME=root
DB_PASSWORD=tkjtkj
------------------------
Migrations
Gunakan fitur Migrations pada laravel untuk mengontrol seluruh perubahan dari struktur database melalui code. Buat model untuk tabel buku dengan perintah
php artisan make:model Buku -m
Perintah diatas akan membuat model dengan nama Buku beserta table migrations-nya. Buka file migration yang baru dibuat pada folder pustaka/database/migrations dan ubah isinya menjadi
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBukusTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//hilangkan s pada bukus
Schema::create('buku', function (Blueprint $table) {
$table->increments('id');
$table->string('judul', 100)->nullable;
$table->string('pengarang', 50)->nullable;
$table->string('penerbit', 50)->nullable;
$table->string('tahun', 4)->nullable;
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//hilangkan s pada bukus
Schema::dropIfExists('buku');
}
}
Nama tabel secara default akan ditambah huruf s dibelakang nya sebagai bentuk plural (jamak), jika tidak hapus huruf s dan sesuaikan. tabel buku akan menampung id (buku) dengan isian otomatis, judul (buku) dengan maksimal panjang karakter yang dapat ditampung 100 karakter dan dapat dikosongkan
Berikan Perintah migrate agar editan kita diatas langusng dieksekusi (buat tabel), dengan perintah
php artisan migrate
R (Read) – cRud
Fungsi pertama dari CRUD yang akan kita bahas adalah R (Read) yaitu menampilkan data dari database agar dapat dilihat oleh user yang sedang menggunakan aplikasi tersebut. Schema-nya adalah kumpulan data dari table buku
akan ditampilkan kedalam list table, sehingga ada 3 hal yang berperan, yakni: Controller, Model dan View.
Karena nama tabel yang kita buat berbeda dengan default laravel (tambahkan s dibelakang nama model), maka kita harus edit dahulu file model Buku.php (pustaka/app) dan sesuaikan menjadi
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Buku extends Model
{
//sesuaikan dengan nama tabel yang diuabh
public $table = "buku";
//jika field PK bukan id tambahkan
//protected $primaryKey = 'kdbuku';
}
Controller berperan untuk menghubungkan antara Model dan View, Model berperan untuk berinteraksi dengan database, sedangkan View berperan untuk melakukan delivery untuk menampilkan data yang ada. Langsung saja kita praktekkan dalam bentuk coding-an, buka terminal, lalu jalankan perintah berikut untuk memembuat controller secara otomatis
php artisan make:controller BukuController
buka file BukuController.php ada difolder pustaka/app/Http/Controllers modifikasi menjadi
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Buku; //load model
class BukuController extends Controller
{
//
public function index()
{
$buku = Buku::orderBy('created_at', 'DESC')->get();
return view('buku.index', compact('buku'));
}
}
Sebelum buat view, kiat generate dahulu template blade dari laravel sekaligus untuk authentikasi (login), dengan perintah
php artisan make:auth
Lanjutkan dengan membuat folder buku di pustaka/resources/views, buat file index.blade.php dan isi dengan
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-md-6">
<h3 class="card-title">Data Buku</h3>
</div>
<div class="col-md-6">
<a href="{{ url('/buku/tambah') }}" class="btn btn-primary btn-sm float-right">Tambah Data</a>
</div>
</div>
</div>
<div class="card-body">
@if (session('success'))
<div class="alert alert-success">
{!! session('success') !!}
</div>
@endif
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>No</th>
<th>Judul Buku</th>
<th>Pengarang</th>
<th>Penerbit</th>
<th>Tahun Terbit</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@forelse($buku as $no => $bk)
<tr>
<td>{{ $no+1 }}</td>
<td>{{ $bk->judul }}</td>
<td>{{ $bk->pengarang }}</td>
<td>{{ $bk->penerbit }}</td>
<td>{{ $bk->tahun }}</td>
<td>
<form action="{{ url('/buku/' . $bk->id) }}" method="POST">
@csrf
<input type="hidden" name="_method" value="DELETE" class="form-control">
<a href="{{ url('/buku/' . $bk->id) }}" class="btn btn-warning btn-sm">Edit</a>
<button class="btn btn-danger btn-sm" onclick="return confirm('Yakin dihapus?')">Hapus</button>
</form>
</td>
</tr>
@empty
<tr>
<td class="text-center" colspan="6">Tidak ada data</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection
edit route pada file web.php dan tambahkan
Route::group(['prefix' => 'buku'], function() {
Route::get('/', 'BukuController@index');
Route::get('/tambah', 'BukuController@tambah');
Route::post('/', 'BukuController@simpan');
Route::get('/{id}', 'BukuController@edit');
Route::put('/{id}', 'BukuController@update');
Route::delete('/{id}', 'BukuController@hapus');
});
Cek hasil program dengan membuka browser dan ketikan pada address bar (asumsi folder pustaka di letakan di folder web browser)
http://localhost/pustaka/buku
jika tidak ada eror akan muncul seperti ini (di saya)
C (Create) – Crud
Fungsi selanjutnya adalah untuk menambahkan data kedalam table buku
. Adapun schema-nya tentu saja adalah sebuah form untuk meng-input data yang kemudian akan diteruskan ke Controller untuk diolah dan disimpan kedalam table buku
.
Buka file BukuController.php
kemudian tambahkan yang diberi tanda
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Buku;
class BukuController extends Controller
{
// view index
public function index()
{
$buku = Buku::orderBy('created_at', 'DESC')->get();
return view('buku.index', compact('buku'));
}
// view tambah
public function tambah()
{
return view('buku.tambah');
}
}
ketika tombol tambah di klik akan diarahkan ke BukuController yang akan membaca fungsi tambah lalu akan membuka filw views pada folder buku dengan file tambah.blade.php
Buat file tambah.blade.php di folder pustaka/resources/views/buku/ dengan isi
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h3 class="card-judul">Tambah Data Buku</h3>
</div>
<div class="card-body">
@if (session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
<form action="{{ url('/buku') }}" method="post">
@csrf
<div class="form-group">
<label for="">Judul Buku</label>
<input type="text" name="judul" class="form-control" placeholder="Masukkan Judul Buku">
</div>
<div class="form-group">
<label for="">Pengarang</label>
<input type="text" name="pengarang" class="form-control" placeholder="Masukkan Nama Pengarang">
</div>
<div class="form-group">
<label for="">Penerbit</label>
<input type="text" name="penerbit" class="form-control" placeholder="Masukkan Nama Penerbit">
</div>
<div class="form-group">
<label for="">Tahun Terbit</label>
<input type="number" name="tahun" class="form-control">
</div>
<div class="form-group">
<input type="reset">
<button class="btn btn-primary btn-md">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Jalan dan akan tampil
Agar tombol Simpan dapat berfungsi, tambahkan beberapa code di model dan controller. kita kerjakan di file model dahulu, tepatnya file Buku.php pada folder pustaka/app/ tambahkan dibawah public $table=”buku”
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Buku extends Model
{
public $table = "buku";
//protected $primaryKey = 'kdbuku';
protected $guarded = [];
}
Lalu kerjakan pada controller BukuController, letakan dibawah public function tambah() { }
public function simpan(Request $request)
{
$this->validate($request, [
'judul' => 'required|string',
'pengarang' => 'string',
'penerbit' => 'string',
'tahun' => 'integer'
]);
try {
$buku = Buku::create([
'judul' => $request->judul,
'pengarang' => $request->pengarang,
'penerbit' => $request->penerbit,
'tahun' => $request->tahun
]);
return redirect('/buku')->with(['success' => '<strong>' . $buku->judul . '</strong> Telah disimpan']);
} catch(\Exception $e) {
return redirect('/buku/tambah')->with(['error' => $e->getMessage()]);
}
}
U (Update) – crUd
Perubahan data adalah sesuatu yang pasti terjadi pada sebuah aplikasi karena kesalahan dalam entry data sering kali terjadi meskipun hanya sebuah kesalahan kecil seperti typo, sehingga sebagai developer kita perlu menyediakan fitur untuk mengubah atau mengedit data.
Dalam fitur ini terdapat dua step yang berperan, step pertama adalah menampilkan data apa yang akan di ubah dan step selanjutnya adalah melakukan perubahan terhadap data itu sendiri kedalam database. Buka file BukuController.php
, kemudian tambahkan function edit dan function update sebagai berikut:
// View Update - bagian EDIT
public function edit($id)
{
$buku = Buku::find($id);
return view('buku.edit', compact('buku'));
}
// bagian update setelah edit
public function update(Request $request, $id)
{
$buku = Buku::find($id);
$buku->update([
'judul' => $request->judul,
'pengarang' => $request->pengarang,
'penerbit' => $request->penerbit,
'tahun' => $request->tahun
]);
return redirect('/buku')->with(['success' => '<b>' . $buku->judul . '</b> Diperbaharui']);
}
sedangkan pada bagian views (file edit.blade.php) yang ada di folder buku isinya adalah (isi file edit di copas dari file tambah dengan beberapa penyesuaian)
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h3 class="card-judul">Tambah Data Buku</h3>
</div>
<div class="card-body">
@if(session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
<form action="{{ url('/buku/' . $buku->id) }}" method="post">
@csrf
<input type="hidden" name="_method" value="PUT" class="form-control">
<div class="form-group">
<label for="">Judul Buku</label>
<input type="text" name="judul" class="form-control" value="{{ $buku->judul }}" placeholder="Masukkan Judul Buku">
</div>
<div class="form-group">
<label for="">Pengarang</label>
<input type="text" name="pengarang" class="form-control" value="{{ $buku->pengarang }}" placeholder="Masukkan Nama Pengarang">
</div>
<div class="form-group">
<label for="">Penerbit</label>
<input type="text" name="penerbit" class="form-control" value="{{ $buku->penerbit }}" placeholder="Masukkan Nama Penerbit">
</div>
<div class="form-group">
<label for="">Tahun Terbit</label>
<input type="number" name="tahun" class="form-control" value="{{ $buku->tahun }}">
</div>
<div class="form-group">
<input type="reset">
<button class="btn btn-primary btn-md">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Demikian sedikit tutorial tentang Update, dan akhirnya kita sampai pada 1 module terakhir tentang hapus alias Delete
D (Delete) – cruD
Fitur terakhir adalah menghapus buku yang telah diinput, baik karena salah atau hal lain. Fitur ini bekerja sangat sederhana karena ketika tombol ditekan maka akan langsung di-handle oleh controller kemudian dikembalikan kehalaman /buku
, sehingga kita tidak memerlukan view baru lagi. Sebelum controller bekerja ada onclick bekerja yang akan cek benar atau tidak data akan dihapus (mencegah ada yg tak senagaj terklik tombol hapus)
//Hapus
public function hapus($id)
{
$buku = Buku::find($id);
$buku->delete();
return redirect('/buku')->with(['success' => '<b>' . $buku->judul . '</b> Berhasil Dihapus']);
}
Data lengkapnya untuk controller menjadi
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Buku;
class BukuController extends Controller
{
// view index
public function index()
{
$buku = Buku::orderBy('created_at', 'DESC')->get();
return view('buku.index', compact('buku'));
}
// view tambah
public function tambah()
{
return view('buku.tambah');
}
// simpan setelah tambah
public function simpan(Request $request)
{
$this->validate($request, [
'judul' => 'required|string',
'pengarang' => 'string',
'penerbit' => 'string',
'tahun' => 'integer'
]);
try {
$buku = Buku::create([
'judul' => $request->judul,
'pengarang' => $request->pengarang,
'penerbit' => $request->penerbit,
'tahun' => $request->tahun
]);
return redirect('/buku')->with(['success' => '<b>' . $buku->judul . '</b> Telah disimpan']);
} catch(\Exception $e) {
return redirect('/buku/tambah')->with(['error' => $e->getMessage()]);
}
}
// View Update - bagian EDIT
public function edit($id)
{
$buku = Buku::find($id);
return view('buku.edit', compact('buku'));
}
// bagian update setelah edit
public function update(Request $request, $id)
{
$buku = Buku::find($id);
$buku->update([
'judul' => $request->judul,
'pengarang' => $request->pengarang,
'penerbit' => $request->penerbit,
'tahun' => $request->tahun
]);
return redirect('/buku')->with(['success' => '<b>' . $buku->judul . '</b> Diperbaharui']);
}
//Hapus
public function hapus($id)
{
$buku = Buku::find($id);
$buku->delete();
return redirect('/buku')->with(['success' => '<b>' . $buku->judul . '</b> Berhasil Dihapus']);
}
}
Untuk Model menjadi
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Buku extends Model
{
public $table = "buku";
//protected $primaryKey = 'kdbuku';
protected $guarded = [];
}
untuk routes pada file web.php mejadi
<?php
/*
|--------------------------------------------------------------------------
| 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');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::group(['prefix' => 'buku'], function() {
Route::get('/', 'BukuController@index');
Route::get('/tambah', 'BukuController@tambah');
Route::post('/', 'BukuController@simpan');
Route::get('/{id}', 'BukuController@edit');
Route::put('/{id}', 'BukuController@update');
Route::delete('/{id}', 'BukuController@hapus');
});
Source Code
Sebagai perbandingan jika ada yang sedikit berbeda bisa cek dan ambil souce code yang sudah saya siapkan di github, silahkan download disini
Lalu ikuti petunjuk yang ada disana atau ikuti langkah-langkah sebagai berikut:
Membuat CRUD menggunakan Larave 6.0 studi kasus tabel Buku pada Perpustakaan
clone repository dengan perintah
$ git clone https://github.com/muhidin/crud-laravel.git
pilih folder project
$ cd crud-laravel
buat database melalui perintah mysql
$ mysql -uroot -p
pada prompt mysql berikan perintah membuat database dengan nama crud-laravel
mysql> create database crud-laravel;
selesai, kembali ke prompt dengan ctrl + D alias exit
mysql> exit;
Update composer dengan perintah
$ composer update
jalankan migrate agar tabel terbentuk
$ php artisan migrate
jalankan serve laravel atau langsung buka browser
$ php artisan serve
Demikian semoga bermanfaat dan sama seru ngoprek.
Penutup
Demikian arikel ini dibuat, semoga menambah manfaat untuk kita semua. Aamiin. Salam sukses dan salam seru dalam belajar (ngoding), dari sahabatmu musa (ms).
makasih paa.. bermanfaat sekali
terima kasih banyak pak ilmunya insya allah bermanfaat bagi saya dan teman-teman
Pingback: CRUD Laravel Pustaka - Daftar Isi | Muhidin Saimin