Tutorial CRUD Laravel 6 Menggunakan ORM Eloquent

Tutorial CRUD Laravel 6 Menggunakan ORM Eloquent

Assalamualaikum, wr. wb. Sekarang Laravel sudah masuk versi 6 nih, gak terasa ya cepet banget. Oke tanpa basa-basi, mari kita belajar membuat projek sederhana dengan penerapan CRUD (Create, Read, Update, Delete) di Laravel 6 menggunakan ORM Eloquent. Oh ya buat kalian yang belum tahu apa itu ORM Eloquent silahkan lihat Disini. Kita dulu sebenarnya juga sudah belajar membuat CRUD ORM Eloquent dan Query Builder di Laravel 5.8.

Sebenarnya tidak jauh berbeda dengan versi yang sebelumnya. Berikut adalah beberapa fitur tambahan pada Laravel 6:
  • Semantic versioning
  • Compatibility with Laravel Vapor,
  • Improved authorization responses,
  • Job middleware,
  • Lazy collections,
  • Sub-query improvements,
  • The extraction of frontend scaffolding to the laravel/ui Composer package
Lalu apa saja yang perlu disiapkan untuk menggunakan Laravel 6 ini? Pertama, pastikan PHP kalian sudah versi 7.2 ke atas, jika belum silahkan update dulu. Cara melihatnya, ketik "php -v" pada command-line kalian. Persiapkan XAMPP atau yang sejenisnya, karena disini kita akan menggunakan database MySQL. Dan tentunya code editor, disini kita menggunakan Visual Code. Berikut adalah tahap-tahap dalam tutorial kali ini:
  1. Install Laravel 6
  2. Konfigurasi Database
  3. Membuat Migrasi
  4. Membuat Resource Route
  5. Membuat Controller dan Model
  6. Membuat View
  7. Hasil Akhir
Jika peralatan kalian sudah siap, mari kita mulai belajarnya. Aplikasi yang akan kita buat kali ini adalah Sistem Informasi Manajemen Perpustakaan Sederhana. Jadi pada aplikasi ini kita dapat menambahkan data buku perpustakaan, sekaligus mengubah dan menghapusnya.



Langkah 1: Install Laravel 6

Untuk melakukan install masih sama dengan versi sebelumnya, sebenarnya ada dua cara jika kalian lihat di dokumentasinya Laravel 6. Kalau saya lebih suka menggunakan Composer Create-Project seperti berikut. Ketikkan pada command-line kalian.

composer create-project --prefer-dist laravel/laravel perpustakaan

Berikut adalah tampilan saat install Laravelnya. Pastikan kalian terkoneksi dengan internet ya.


Langkah 2: Konfigurasi Database

Sebelumnya buat dulu database yang akan kalian pakai sesuai dengan database kalian (Saya asumsikan kalian sudah bisa membuat database-nya). Disini saya menggunakan MySQL pada phpMyAdmin. Setelah selesai membuat database, buka dile .env kalian, lalu setting sesuai nama, username dan password database-yang kalian buat.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=perpustakaan
DB_USERNAME=root
DB_PASSWORD=

Langkah 3: Membuat Migrasi

Karena tema kita tentang sistem manajemen perpustakaan, maka kita akan membuat tabel bernama "books". Ketikkan kode berikut pada command-line kalian.

php artisan make:migration create_books_table --create=books

Jika berhasil, kita akan mendapat file baru pada folder database/migrations dengan nama file "2020_01_12_063822_create_books_table". Sekarang kita buka file tersebut, dan modifikasi seperti berikut ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateBooksTable extends Migration
{

    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('writer');
            $table->string('publisher');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('books');
    }
}


Sekarang akan saya jelaskan singkat apa yang sudah saya perbuat pada kode di atas. Jadi buat kalian yang sudah terbiasa menggunakan Laravel pasti sudah tidak asing lagi dengan yang namanya migrasi. Jadi initinya kita dapat membuat tabel dengan kolom-kolom yang kita butuhkan tanpa harus membuatnya pada aplikasi database kita, misal phpMyAdmin dkk.

Jadi disini kita membuat tabel dengan nama "books" dan kolom bernama "title", "writer", dan "publisher" bertipe string. Disini saya sarankan kalian biasakan menulis nama kolom dengan bahasa inggris, agar nanti terbiasa jika di dunia kerja. Dan satu lagi, di laravel akan otomatis membuatkan kolom "created_at" dan "updated_at" dengan fungsi timestamps() jadi tidak usah dihapus ya, karena ini biasanya bawaan saat pertama membuat file migrasi.

Untuk melihat tipe data yang dapat kita gunakan untuk membuat kolom, silahkan cek fungs-fungsi yang sudah disediakan Laravel Disini. Selanjutnya kita eksekusi file migrasi yang telah kita buat tadi dengan perintah beikut.

php artisan migrate

Dan tabel books berhasil kita buat.


Langkah 4: Membuat Resource Route

Buat yang baru tahu route silahkan cek tutorial yang pernah saya buat Disini. Nah dengan resource route ini, kita sudah dapat route untuk membuat fungsi CRUD. Jadi tidak perlu repot-repot membuat masing-masing route untuk CRUD seperti post, get, delete, dan update. 

Oke sekarang tambahkan kode berikut pada routes/web.php

<?php

Route::resource('books', 'BooksController');

Sekarang silahkan cek dengan menggunakan perintah berikut.

php artisan route:list

Maka kalian akan memperoleh hasil seperti gambar berikut.


Dengan melihat tabel route list di atas kita bisa tahu bagaimana cara memanggil route-route  tersebut pada Controller nanti. 

NB: Kalian dapat menjalankan perintah route:list jika kalian sudah menjalankan langkah ke-5

Langkah 5: Membuat Controller dan Model

Karena Laravel merupakan framework yang menerapkan pola MVC, pasti kita membutuhkan Controller dan Model untuk membuat logic-nya. Nah di Laravel ini kalian dapat dengan mudah membuat file Controller dan Model secara bersamaan. Silahkan ketikkan kode berikut ini.

php artisan make:controller BooksController --resource --model=Book

Nah perhatikan perintah di atas, kita menambahkan --resource sehingga pada file Controller yang kita dapat secara otomatis akan terdapat 7 fungsi berikut yang dapat kita gunakan untuk membuat operasi CRUD.
  • index()
  • create()
  • store()
  • show()
  • edit()
  • update()
  • destroy()
Sekarang kita buka app/Http/Controllers/BooksController.php kemudian ketikkan kodenya seperti berikut ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php

namespace App\Http\Controllers;

use App\Book;
use Illuminate\Http\Request;

class BooksController extends Controller
{

    public function index()
    {
        $books = Book::all(); //Fungsi untuk mengambil seluruh data pada tabel books

        return view('books.index', compact('books')); //Redirect ke halaman books/index.blade.php dengan membawa data books tadi
    }

    public function create()
    {
        return view('books.create'); //Redirect ke halaman books/create.blade.php
    }

    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required', //nama form "title" harus diisi (required)
            'writer' => 'required', //nama form "writer" harus diisi (required)
            'publisher' => 'required', //nama form "publisher" harus diisi (required)
        ]); //Memvalidasi inputan yang kita kirim apakah sudah benar

        Book::create($request->all()); //Fungsi untuk menyimpan data inputan kita

        return redirect()->route('books.index')
            ->with('success', 'Book created successfully.'); //Redirect ke halaman books/index.blade.php dengan pesan success
    }

    public function show(Book $book)
    {
        return view('books.detail', compact('book')); //Redirect ke halaman books/detail.blade.php dengan membawa data book sesuai ID yang dipilih
    }

    public function edit(Book $book)
    {
        return view('books.edit', compact('book')); //Redirect ke halaman books/edit.blade.php dengan membawa data book sesuai ID yang dipilih
    }

    public function update(Request $request, Book $book)
    {
        $request->validate([
            'title' => 'required', //nama form "title" harus diisi (required)
            'writer' => 'required', //nama form "writer" harus diisi (required)
            'publisher' => 'required', //nama form "publisher" harus diisi (required)
        ]); //Memvalidasi inputan yang kita kirim apakah sudah benar

        $book->update($request->all()); //Fungsi untuk mengupdate data inputan kita

        return redirect()->route('books.index')
            ->with('success', 'Book updated successfully'); //Redirect ke halaman books/index.blade.php dengan pesan success
    }

    public function destroy(Book $book)
    {
        $book->delete(); //Fungsi untuk menghapus data sesuai dengan ID yang dipilih

        return redirect()->route('books.index')
            ->with('success', 'Book deleted successfully'); //Redirect ke halaman books/index.blade.php dengan pesan success
    }
}

Untuk penjelasan tiap kode silahkan baca di komen pada kode di atas ya. Jadi initinya setiap aksi yang berhasil kita lakukan, akan memberikan pesan success yang nantinya akan ditangkap oleh fungsi session pada view.

Kemudian pada app/Book.php silahkan tambahkan $fillable dimana untuk membuat kolom-kolom tersebut dapat diisi atau ditambahkan data.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $fillable = [
        'title', 'writer', 'publisher'
    ];
}

Langkah 6: Membuat View

Saya asumsikan kalian sudah mengerti cara templating pada laravel menggunakan blade. Pertama buat folder books pada resources/views. Terakhir buat file-file berikut ini.
  • layout.blade.php
  • index.blade.php
  • create.blade.php
  • edit.blade.php
  • detail.blade.php
Kemudian ketikkan kode berikut pada masing-masing file.

layout.blade.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
    <head>
        <title>Sistem Informasi Manajemen Perpustakaan</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
        <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

index.blade.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@extends('books.layout')
 
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb mt-3 mb-3">
            <div class="text-left">
                <h2>Kelola Data Buku</h2>
            </div>
            <div class="text-right">
                <a class="btn btn-success" href="{{ route('books.create') }}">Tambah Buku</a>
            </div>
        </div>
    </div>
   
    @if ($message = Session::get('success'))
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        <strong><p>{{ $message }}</p></strong>
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
    @endif
   
    <table class="table table-striped table-bordered">
        <tr>
            <th>No</th>
            <th>Judul</th>
            <th>Penulis</th>
            <th>Penerbit</th>
            <th width="280px">Action</th>
        </tr>
        @foreach ($books as $key => $book)
        <tr>
          
            <td>{{ $key+1 }}</td>
            <td>{{ $book->title }}</td>
            <td>{{ $book->writer }}</td>
            <td>{{ $book->publisher }}</td>
            <td>
                <form action="{{ route('books.destroy',$book->id) }}" method="POST">
   
                    <a class="btn btn-info" href="{{ route('books.show',$book->id) }}">Show</a>
    
                    <a class="btn btn-primary" href="{{ route('books.edit',$book->id) }}">Edit</a>
   
                    @csrf
                    @method('DELETE')
      
                    <button type="submit" class="btn btn-danger">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </table>
      
@endsection

create.blade.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@extends('books.layout')
  
@section('content')
   
<div class="container mt-5">
   
    <div class="row justify-content-center align-items-center">
        <div class="card" style="width: 24rem;">
            <div class="card-header">
            Tambah Buku
            </div>
            <div class="card-body">
                @if ($errors->any())
                <div class="alert alert-danger">
                    <strong>Whoops!</strong> There were some problems with your input.<br><br>
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li>{{ $error }}</li>
                        @endforeach
                    </ul>
                </div>
            @endif
            <form method="post" action="{{ route('books.store') }}" id="myForm">
            @csrf
                <div class="form-group">
                    <label for="title">Judul</label>                    <input type="text" name="title" class="form-control" id="title" aria-describedby="title" placeholder="Masukkan Judul Buku">                </div>
                <div class="form-group">
                    <label for="writer">Penulis</label>                    <input type="text" name="writer" class="form-control" id="writer" aria-describedby="writer" placeholder="Masukkan Nama Penulis">                </div>
                <div class="form-group">
                    <label for="publisher">Penerbit</label>                    <input type="text" name="publisher" class="form-control" id="publisher" aria-describedby="publisher" placeholder="Masukkan Nama Penerbit">
                </div>
            <button type="submit" class="btn btn-primary">Submit</button>
            </form>
            </div>
        </div>
    </div>
    </div>
@endsection

edit.blade.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@extends('books.layout')
  
@section('content')
   
<div class="container mt-5">
   
    <div class="row justify-content-center align-items-center">
        <div class="card" style="width: 24rem;">
            <div class="card-header">
            Edit Buku
            </div>
            <div class="card-body">
                @if ($errors->any())
                <div class="alert alert-danger">
                    <strong>Whoops!</strong> There were some problems with your input.<br><br>
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li>{{ $error }}</li>
                        @endforeach
                    </ul>
                </div>
            @endif
            <form method="post" action="{{ route('books.update',$book->id) }}" id="myForm">
            @csrf
            @method('PUT')
                <div class="form-group">
                    <label for="title">Judul</label>                    <input type="text" name="title" class="form-control" id="title" value="{{ $book->title }}" aria-describedby="title" placeholder="Masukkan Judul Buku">                </div>
                <div class="form-group">
                    <label for="writer">Penulis</label>                    <input type="text" name="writer" class="form-control" id="writer" value="{{ $book->writer }}" aria-describedby="writer" placeholder="Masukkan Nama Penulis">                </div>
                <div class="form-group">
                    <label for="publisher">Penerbit</label>                    <input type="text" name="publisher" class="form-control" id="publisher" value="{{ $book->publisher }}" aria-describedby="publisher" placeholder="Masukkan Nama Penerbit">
                </div>
            <button type="submit" class="btn btn-primary">Submit</button>
            </form>
            </div>
        </div>
    </div>
</div>
@endsection

detail.blade.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@extends('books.layout')
  
@section('content')

<div class="container mt-5">
   
    <div class="row justify-content-center align-items-center">
        <div class="card" style="width: 24rem;">
            <div class="card-header">
            Detail Buku
            </div>
            <div class="card-body">
                <ul class="list-group list-group-flush">
                    <li class="list-group-item"><b>Judul: </b>{{$book->title}}</li>
                    <li class="list-group-item"><b>Penulis: </b>{{$book->writer}}</li>
                    <li class="list-group-item"><b>Penerbut: </b>{{$book->publisher}}</li>
                </ul>
            </div>
            <a class="btn btn-success" href="{{ route('books.index') }}">Kembali</a>

        </div>
    </div>
</div>
@endsection

Oke, projek perpustakaan kita sudah selesai, Oh ya buat kalian yang mungkin masih belum tahu cara menampilkan data pada view, kalian bisa lihat penjelasannya Disini sudah saya jelaskan secara detail.



Langkah 7: Hasil Akhir 

Untuk menjalankan projek, ketikkan ini pada command-line.

php artisan serve

Akses dengan url localhost:8000/books maka kurang lebih hasilnya seperti berikut:

Tutorial CRUD Laravel 6 Menggunakan ORM Eloquent
Tampilan index

Tutorial CRUD Laravel 6 Menggunakan ORM Eloquent
Tampilan form tambah Buku

Tutorial CRUD Laravel 6 Menggunakan ORM Eloquent
Tampilan berhasil tambah data


Oke sekian tutorial kali ini, jika kalian ingin mengembangkannya sendiri, silahkan dioprek-oprek. Jika mau pull langsung, silahkan kunjungi Disini.
Semoga Bermanfaat, Mohon maaf jika ada kurang lebihnya, silahkan tanya di komentar jika ada yang masih bingung.

14 Komentar

  1. Blog nya sangat membantu kak,,, dengan penjelasan yg jelas dan mudah dimengerti sangat bermanfaat bagi saya
    Terima kasih kak
    Nama: Yulinda Sari
    Nim: 1922500197
    Dan link web kampus saya
    https://www.atmaluhur.ac.id/

    BalasHapus
  2. Cara mengatasi Invalid argument supplied for foreach() (view:
    Bagaimana Kak..???

    BalasHapus
    Balasan
    1. Cek penulisan variabel-nya, ada yang salah tuh sepertinya

      Hapus
  3. Hai kak. Terimakasih kak artikel nya sangat membantu saya dan mudah di pahami. Semoga sukses kedepannya ya kak dan ditunggu artikel selanjutnya . Terimakasih kak. Perkenalkan saya Roki Abdul Jalil , NIM 19225000192, kelompok SI2K, link kampus https://www.atmaluhur.ac.id/

    BalasHapus
  4. Terimakasih kak, postingannya sangat berguna sekali dan mudah untuk dipahami. Ditunggu ya kak postingan selanjutnya. Perkenalkan nama saya Sintia dan Nim saya 1922500186 dan link Web kampus saya https://www.atmaluhur.ac.id/

    BalasHapus
  5. Terimakasih atas blognya kaka, ini sangat membantu saya Dan mudah dipahami dalam belajar script untuk CRUD dari php ke mysql. Semoga kaka terus memberikan artikel berikutnya. Dan perkenalkan nama saya Johan alamsyah, Nim 1922500193,Link kampus saya https://www.atmaluhur.ac.id/

    BalasHapus
  6. Terimakasih atas postingan yang Anda bagikan sangat berguna, membantu saya mengerjakan tugas kuliah saya. Terus berkarya ya semoga postingan yg lainnya juga dapat menginspirasi. Perkenalkan nama saya Shofi Rachmawati, NIM 1922500133, dan kunjungi juga web kampus saya :
    https://www.atmaluhur.ac.id

    BalasHapus
  7. Selamat malam kak, Terima kasih telah memberikan ilmu yang bermanfaat untuk saya, materinya mudah di pahami, dan juga contoh-contoh yang kakak bagikan sangat membantu saya untuk di praktekkan kembali dalam mempelajari materi tentang Script untuk CRUD dari PHP ke mysql. , semoga sukses selalu, di beri kesehatan agar bisa memberikan ilmu yang bermanfaat di artikel selanjutnya, Perkenalkan
    nama saya : Reza anggraini
    Nim : 1922500196
    jangan lupa kunjungi web kampus saya ya kak https://www.atmaluhur.ac.id/
    Terima Kasih kak....

    BalasHapus
  8. Terimah kasih artikelnya sangat membantu kami terutama mahasiswa yang sedang belajar tentang web saya mahasiswa dari stmik atmaluhur dengan nim 1922500120 Sri Dewayanti, ini situs kampus saya https://www.atmaluhur.ac.id

    BalasHapus
  9. proses menghapus tidak sesuai apa yg klik ka dalam kodingan nya gmna yaa?

    BalasHapus
Lebih baru Lebih lama