Tutorial CRUD Laravel 8 Dengan Eloquent ORM dan Bootstrap 4

Tutorial CRUD Laravel 8 Dengan Eloquent ORM dan Bootstrap 4

Assalamualaikum, wr. wb. Pada tutorial ini kita akan belajar cara membuat CRUD Laravel 8. Kita akan belajar cara sederhana membuat CRUD Laravel 8 dengan penjelasan yang cukup singkat. Karena sebenarnya pun tidak ada banyak perbedaan dengan versi sebelumnya. Kita menggunakan fitur Eloquent ORM pada tutorial ini. Jika kalian sangat pemula di Laravel dan langsung nyasar kesini, maka saya sarankan untuk mengikuti tutorial yang lebih detail penjelasannya disini (Tutorial CRUD Laravel Dengan Eloquent ORM).

Selain penjelasan dalam artikel, kita juga menambahkan penjelasan menggunakan komen pada kodenya langsung agar lebih mudah dipahami. Kita akan belajar tentang penggunaan controller, model, route, dan blade view.

Ingat, beberapa hal yang harus disiapkan diantaranya PHP versi 7.3 atau yang di atasnya, XAMPP atau sejenisnya, dan kode editor (kita biasa menggunakan Visual Studio Code).

Berikut adalah tahap-tahap dalam tutorial kali ini:
  1. Install Laravel 8
  2. Konfigurasi Database
  3. Migrasi
  4. Membuat Resource Controller dan Route
  5. Membuat View
  6. Hasil Akhir
Jika peralatan kalian sudah siap, mari kita mulai belajarnya. Aplikasi yang akan kita buat kali ini adalah Fitur Manajemen Pengguna. Jadi kita dapat menambahkan pengguna baru, menampilkan, mengedit, 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 8. Kalau saya lebih suka menggunakan Composer Create-Project seperti berikut. Ketikkan pada command-line kalian.

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


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=laravel8
DB_USERNAME=root
DB_PASSWORD=

Langkah 3: Migrasi

Karena kita akan membuat fitur manajemen pengguna, maka kita langsung jalankan perintah migrasi saja, karena laravel sudah menyediakan file migrasi untuk tabel user/pengguna. Jika kalian ingin mengetahui cara membuat file migrasi baru, silahkan lihat di tutorial berikut bagian membuat migrasi.

Sekarang ketikkan perintah berikut:

php artisan make:migrate


Langkah 4: Membuat Resource Controller dan 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. 

Tapi sebelumnya kita buat controller untuk user dahulu, kita sudah punya model user, jadi cukup buat controllernya saja. Ketikkan perintah ini di controller.

php artisan make:controller UserController --resource 

Oke sekarang tambahkan kode berikut pada routes/web.php

<?php
use App\Http\Controllers\UserController;
Route::resource('users'UserController::class);

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/UserController.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
69
70
71
72
73
74
75
76
77
78
79
<?php

namespace App\Http\Controllers;

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


class UserController extends Controller
{
    public function index()
    {
        //fungsi eloquent menampilkan data menggunakan pagination
        $users = User::latest()->paginate(5);
        return view('users.index', compact('users'))
            ->with('i', (request()->input('page', 1) - 1) * 5);
    }

    public function create()
    {
        return view('users.create');
    }

    public function store(Request $request)
    {
        //melakukan validasi data
        $request->validate([
            'name' => 'required',
            'email' => 'required',
            'password' => 'required',
        ]);

        //fungsi eloquent untuk menambah data
        User::create($request->all());

        //jika data berhasil ditambahkan, akan kembali ke halaman utama
        return redirect()->route('users.index')
            ->with('success', 'User Berhasil Ditambahkan');
    }

    public function show($id)
    {
        //menampilkan detail data dengan menemukan/berdasarkan id user
        $user = User::find($id);
        return view('users.detail', compact('user'));
    }

    public function edit($id)
    {
        //menampilkan detail data dengan menemukan/berdasarkan id user untuk diedit
        $user = User::find($id);
        return view('users.edit', compact('user'));
    }

    public function update(Request $request, $id)
    {
        //melakukan validasi data
        $request->validate([
            'name' => 'required',
            'email' => 'required',
            'password' => 'required',
        ]);

        //fungsi eloquent untuk mengupdate data inputan kita
        User::find($id)->update($request->all());

        //jika data berhasil diupdate, akan kembali ke halaman utama
        return redirect()->route('users.index')
            ->with('success', 'User Berhasil Diupdate');
    }

    public function destroy($id)
    {
        //fungsi eloquent untuk menghapus data
        User::find($id)->delete();
        return redirect()->route('users.index')
            ->with('success', 'User Berhasil Dihapus');
    }
}

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.

Jangan lupa untuk setting nilai $fillable di Model User berdasarkan data yang ingin dapat kita tambah atau edit, pada kasus ini name, email, dan password. Tapi kalau kita pake Model User biasanya sudah otomatis tersetting sih.

Langkah 5: Membuat View

Saya asumsikan kalian sudah mengerti cara templating pada laravel menggunakan blade. Pertama buat folder users 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
@extends('users.layout')
 
@section('content')
    <div class="row">
        <div class="col-lg-12 margin-tb">
            <div class="pull-left mt-2">
                <h2>Laravel 8 CRUD - Manajemen User</h2>
            </div>
            <div class="float-right my-2">
                <a class="btn btn-success" href="{{ route('users.create') }}"> Create New User</a>
            </div>
        </div>
    </div>
   
    @if ($message = Session::get('success'))
        <div class="alert alert-success">
            <p>{{ $message }}</p>
        </div>
    @endif
   
    <table class="table table-bordered">
        <tr>
            <th>No</th>
            <th>Name</th>
            <th>Email</th>
            <th width="280px">Action</th>
        </tr>
        @foreach ($users as $user)
        <tr>
            <td>{{ ++$i }}</td>
            <td>{{ $user->name }}</td>
            <td>{{ $user->email }}</td>
            <td>
                <form action="{{ route('users.destroy',$user->id) }}" method="POST">
   
                    <a class="btn btn-info" href="{{ route('users.show',$user->id) }}">Show</a>
    
                    <a class="btn btn-primary" href="{{ route('users.edit',$user->id) }}">Edit</a>
   
                    @csrf
                    @method('DELETE')
      
                    <button type="submit" class="btn btn-danger">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </table>
    <div class="text-center">
        {!! $users->links() !!}
    </div>
      
@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
39
40
41
42
43
@extends('users.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 User
            </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('users.store') }}" id="myForm">
            @csrf
                <div class="form-group">
                    <label for="name">Name</label>                    
                    <input type="text" name="name" class="form-control" id="name" aria-describedby="name" >                
                </div>
                <div class="form-group">
                    <label for="email">Email</label>                    
                    <input type="email" name="email" class="form-control" id="email" aria-describedby="email" >                
                </div>
                <div class="form-group">
                    <label for="password">Password</label>                    
                    <input type="password" name="password" class="form-control" id="password" aria-describedby="password" >                
                </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
@extends('users.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 User
            </div>
            <div class="card-body">
                <ul class="list-group list-group-flush">
                    <li class="list-group-item"><b>Name: </b>{{$user->name}}</li>
                    <li class="list-group-item"><b>Email: </b>{{$user->email}}</li>
                </ul>
            </div>
            <a class="btn btn-success mt-3" href="{{ route('users.index') }}">Kembali</a>

        </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
40
41
42
43
44
@extends('users.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 User
            </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('users.update', $user->id) }}" id="myForm">
            @csrf
            @method('PUT')
                <div class="form-group">
                    <label for="name">Name</label>                    
                    <input type="text" name="name" class="form-control" id="name" value="{{ $user->name }}" aria-describedby="name" >                
                </div>
                <div class="form-group">
                    <label for="email">Email</label>                    
                    <input type="text" name="email" class="form-control" id="email" value="{{ $user->email }}" aria-describedby="email" >                
                </div>
                <div class="form-group">
                    <label for="writer">Password</label>                    
                    <input type="password" name="password" class="form-control" id="password" value="{{ $user->password }}" aria-describedby="password" >                
                </div>
            <button type="submit" class="btn btn-primary">Submit</button>
            </form>
            </div>
        </div>
    </div>
</div>
@endsection

Oke, projek manajemen user 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 6: Hasil Akhir 

Untuk menjalankan projek, ketikkan ini pada command-line.

php artisan serve

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

Tutorial CRUD Laravel 8 Dengan Eloquent ORM dan Bootstrap 4

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

Posting Komentar

11 Komentar

  1. Saya coba dengan mencoba dengan crud seperti model user diatas, knp class Controllernya not found ya gan? Route nya sdh sesuai dengan penulisan.

    BalasHapus
    Balasan
    1. coba cek lagi penulisannya, besar kecil hurufnya, siapa tahu typo

      Hapus
    2. Kalau gak gitu, kakak lupa untuk menambahkan
      kode ini (use App\Http\Controllers\UserController;) di route.php nya

      Hapus
  2. php artisan make:migrate atau php artisan migrate?

    BalasHapus
  3. gan punya saya kenapa ya Target class [EmployeesController] does not exist. error gini apa yg di route nya kurang lengkap ya cuma ini kan yg di tambah
    use App\Http\Controllers\EmployeesController;
    Route::resource('employees', 'EmployeesController');

    BalasHapus
    Balasan
    1. yg error ini saya sudah mendapatkan solusinya untuk router nya di ganti ini Route::get('/employees/index' , [EmployeesController::class,'index']);
      Route::get('/employees/create' , [EmployeesController::class,'create']);
      Route::resource('/employees' , EmployeesController::class);

      Hapus
  4. saya menemukan error lagi Add [_token] to fillable property to allow mass assignment on [App\Models\Employees]. itu ketika insert dan edit itu kenapa ya token yg di maksud apa ya?

    BalasHapus
    Balasan
    1. saya dapat solusinya di https://gist.github.com/rajucs/cea745d625be736e1ac0b19eba48f1aa
      dengan memodifikasi modelnya menjadi seperti ini
      protected $table = 'employees';
      protected $fillable = [
      'name',
      'telepon',
      'email',
      'departement_id'
      ];

      Hapus
  5. Ada link github nya?

    BalasHapus