Tutorial CRUD Laravel 8 - MySQL Database

wahyunanangwidodo

wahyunanangwidodo Sabtu, 10 April 2021

Tutorial CRUD Laravel 8 - MySQL Database

Salah satu konsep yang perlu dipelajari dan dipahami ketika mempelajari laravel adalah bagaimana membuat suatu fungsi untuk melakukan tindakan penyimpanan, pengambilan, pembaharuan, dan penghapusan suatu data untuk membangun suatu aplikasi yang komplek.

Konsep ini biasa disebut dengan CRUD, yang merupakan singkatan dari (CREATE, READ, UPDATE, dan DELETE).

Pembuatannya juga akan mudah di laravel dengan menggunakan cara-cara atau fitur yang ada; salah satunya adalah seperti yang akan kita pelajari bersama disini.

Yang akan kita buat:

Kita akan membuat dan mempelajari aplikasi CRUD laravel 8 sederhana dengan MySQL database sebagai penyimpanan / manajemen basis data.

Instalasi Laravel

Kita mulai dengan melakukan instalasi laravel. Silahkan gunakan salah satu perintah dibawah ini.

//composer
composer create-project laravel/laravel laravel-crud

//laravel installer
laravel new laravel-crud

Konfigurasi Database

Silahkan buat database MySQL baru kemudian buka file .env pada projek untuk dihubungkan dengan mengaturnya pada DB_DATABASE; seperti dibawah ini.

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

Membuat File Migrasi dan Model

Selanjutnya kita buat file migrasi baru untuk membuat tabel dan kolom database. Kita gunakan perintah dibawah ini untuk membuat file migrasi sekaligus membuat model untuk tabel yang dibuat.

php artisan make:model Post --migration

Sebagai contoh tabel yang dibuat yaitu tabel posts, jika ingin membuat dengan nama lain silahkan disesuaikan.

File model yang terbuat berada di direktori app > Models dan file migrasi di direktori database > migrations.

Membuat Kolom

Kita buka file migrasi yang telah dibuat tadi untuk kita tambahkan beberapa kolom. Pada up() method silahkan buat seperti dibawah ini.

//...create_posts_table.php
public function up()
{
  Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('body');
    $table->timestamps();
  });
}

Kemudian jalankan perintah php artisan migrate untuk mengirim ke database.

@laravel-app ➜  php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (888.57ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (973.35ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (965.86ms)
Migrating: 2021_02_27_064548_create_posts_table
Migrated:  2021_02_27_064548_create_posts_table (288.21ms)
MariaDB [laravel_crud]> desc posts;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)        | NO   |     | NULL    |                |
| body       | text                | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.114 sec)

Sampai disini database, tabel, kolom telah dibuat.

Eloquent: Mass Assignment

Langkah selanjutnya kita buka model Post.php untuk membuat properti $fillable dan menambahkan kolom tabel, seperti dibawah ini.

//app/Models/Post.php
class Post extends Model
{
    use HasFactory;
    
    protected $fillable = [
        'title',
        'body'
    ];
}

Mass Assignment merupakan salah satu fitur di laravel yang melindungi atau memproteksi kolom / field suatu tabel dan menggunakan pernyataan tunggal yang singkat dengan create method untuk menyimpan data melalui model.

Namun untuk menggunkan metode Mass Assignment agar dapat mengakses atau berinteraksi dengan setiap kolom tabel yang menggunakan model, kita perlu mendaftarkannya pada model tersebut; seperti yang kita buat diatas.

Membuat Controller

Kita lanjutkan untuk membuat sebuah controller. Kita akan membuat controller dengan memanfaatkan fitur --resource yang menyediakan method / metode-metode yang kita butuhkan yang sesuai konsep CRUD.

php artisan make:controller PostController --resource

Controller baru akan berada di direktori app > Http > Controllers.

Membuat Route

Selanjutnya kita buat route ke setiap method() di contoller menggunakan resources method.

Silahkan buka route web.php dan tambahkan dibawah ini.

//routes/web.php
use App\Http\Controllers\PostController;

Route::resource('posts', PostController::class);

Jalankan perintah php artisan route:list untuk melihat daftar route yang ada.

@laravel-app  ➜  php artisan route:list
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+
| Domain | Method    | URI               | Name          | Action                                      | Middleware |
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+
|        | GET|HEAD  | /                 |               | Closure                                     | web        |
|        | GET|HEAD  | posts             | posts.index   | App\Http\Controllers\PostController@index   | web        |
|        | POST      | posts             | posts.store   | App\Http\Controllers\PostController@store   | web        |
|        | GET|HEAD  | posts/create      | posts.create  | App\Http\Controllers\PostController@create  | web        |
|        | GET|HEAD  | posts/{post}      | posts.show    | App\Http\Controllers\PostController@show    | web        |
|        | PUT|PATCH | posts/{post}      | posts.update  | App\Http\Controllers\PostController@update  | web        |
|        | DELETE    | posts/{post}      | posts.destroy | App\Http\Controllers\PostController@destroy | web        |
|        | GET|HEAD  | posts/{post}/edit | posts.edit    | App\Http\Controllers\PostController@edit    | web        |
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+

Insert Data

Setelah Model, Controller, Route telah dibuat, kita lanjutkan untuk mengerjakan fungsi membuat data atau 'CREATE' meyimpan data ke database.

Kita akan membuat halaman dengan html form input dan membuat metode insert di controller.

Pertama silahkan buat folder baru dengan nama layouts di direktori views dan buat sebuah file app.blade.php didalamnya, lalu silahkan copas html di bawah.

Kita membuat struktur template inheritance dengan parent / main blade.

//views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>@yield('title')</title>
  <link rel="stylesheet" href="{{ asset('css/style.css') }}"/>
</head>
<body>
  <div class="container">
      @yield('content')
  </div>
</body>
</html>

Kita buat sebuah file css. Silahkan buat folder baru pada direktori public dengan nama css dan tambahkan file styles.css didalamnya.

Kemudian silahkan copas css dibawah ini.

//public/css/styles.css
.container{
 margin:1rem;
 padding: 1rem;
 border: 2px solid #444;
 min-height:80vh;
 background-color: #f9f9f9;
}
.wrapper h1{
  padding-bottom: 14px;
  border-bottom: 2px solid #444;
  margin-top: 0;
}
a{
  color: #fff;
  text-decoration: none;
}
input{
  padding: 6px;
  border-radius: 2px;
  border: 2px solid #444;
}
.btn-blue{
  padding: 6px;
  border-radius: 2px;
  background: #3f51b5;
  color: #fff;
  border: 2px solid #3f51b5;
 }
.alert-success p{
  background: #009688;
  padding: 12px;
  color: #ffff;
}
.alert-danger ul{
  background: #f34444;
  color:#fff;
  padding: 1rem 2rem;
} 
table,
td {
    border: 1px solid #333;
    text-align:center;
}
tr{
    height: 32px;
}
thead,
tfoot {
    background-color: #3f51b5;
    color: #fff;
}
.btn-red, .btn-green{
    padding: 6px;
    border-radius: 2px; 
    color: #fff;
    width: 50%;
   
}
.btn-red{
  border: 2px solid #e14949;
  background: #e14949;
}
.btn-green{
  border: 2px solid #1a887e;
  background: #1a887e;
}

Selanjutnya buat kembali folder baru di direktori views dengan nama post dan file create.blade.php didalamnya dan copas html dibawah ini.

//views/post/create.blade.php
@extends('layouts.app')
@section('title', 'Buat Post Baru')
@section('content')
<div class="wrapper">
  <h1>Buat Post Baru</h1>
  
  @if (session('success'))
  <div class="alert-success">
    <p>{{ session('success') }}</p>
  </div>
  @endif
  
  @if ($errors->any())
  <div class="alert-danger">
    <ul>
      @foreach ($errors->all() as $error)
      <li>{{ $error }}</li>
      @endforeach
    </ul>
  </div>
  @endif
  
  <form method="POST" action="{{ url('posts') }}">
    @csrf
    <input name="title" type="text" placeholder="Title..."> 
    <input name="body" type="text" placeholder="Body...">
    <button class="btn-blue">Submit</button>
  </form>
</div>
@endsection

Pada atribut action form diatas, kita gunakan route dengan URI 'posts' atau bisa juga route name (lihat route list) ke method store() di controller dan menampilkan pesan berhasil dan atau keterangan error jika ada kesalahan validasi.

Selanjutnya pada create() dan store() method di PostController.php silahkan buat sepeti dibawah ini.

use App\Models\Post;

...

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

public function store(Request $request)
{
  $request->validate([
    'title' => 'required|unique:posts|max:150',
    'body' => 'required', 
  ]);

  $input = $request->all();

  $post = Post::create($input);
 
  return back()->with('success',' Post baru berhasil dibuat.');
}

Jangan lupa untuk memangil model model dari pada Post. Sampai disini kita bisa mencobanya untuk insert menyimpan data baru.

Jalankan php artisan serve dan buka url http://localhost:8000/posts/create pada browser.

Tutorial CRUD Laravel 8 - MySQL Database
Tutorial CRUD Laravel 8 - MySQL Database

Menampilkan Data

Setelah selesai dan berhasil membuat proses untuk pembuatan atau menyimpan data baru, kita lanjutkan untuk membuat fungsi menampilkan semua data yang ada di database pada suatu halaman.

Kita ke controller terlebih dahulu untuk membuat membuat request mengambil data dan menentukan lokasi dimana akan ditampilkan.

Kita mengambil semua data yang ada pada tabel posts melalui model menggunakan all() method. Pada index() method silahkan buat seperti dibawah ini.

public function index()
{
   $posts = Post::all(); 
        
   return view('post.index', ['posts' => $posts]); 
}

Kemudian buat file baru di folder views > post dengan nama index.blade.php dan copas html dibawah ini.

//views/layouts/index.blade.php
@extends('layouts.app')
@section('title', 'Semua Post')
@section('content')
<div class="wrapper">
  <h1 style="text-align: center;">Semua Post</h1>
  <table style="width:100%">
    <thead>
      <tr>
        <th>Title</th>
        <th>Body</th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      @foreach ($posts as $post)
      <tr>
        <td style="width: 200px" >{{ $post->title}}</td>
        <td style="width: 500px" >{{ $post->body }}</td>
        <td style="width: 100px"><button class="btn-green">Edit</button></td>
        <td style="width: 100px"><button class="btn-red">Hapus</button></td>
      </tr>
      @endforeach
    </tbody>
  </table>
</div>
@endsection

Simpan dan lihat pada browser dengan url http://localhost:8000/posts; hasilnya seperti gambar berikut.

Tutorial CRUD Laravel 8 - MySQL Database

Kita telah berhasil menampilkan semua data yang ada di database, dan kita tampilkan dalam bentuk tabel. Pada tabel tersebut kita tambahkan juga dua buah button, edit dan delete yang akan kita kerjakan sesuai fungsinya di tahap selanjutnya.

Edit Data

Kita ke tahap edit membuat fungsi pembaharuan data. Yang akan kita lakukan adalah menentukan data mana yang dipilih untuk di edit.

Kita akan membuat permintaan untuk mengambil data tertentu berdasarkan index atau ID dari suatu data record yang ada di database pada tabel posts.

Pengambilan data untuk data tertentu dan di tampilkan pada halaman tersendiri atau dinamis memerlukan parameter untuk mengidentifikasi data tersebut.

Kita akan membuat halaman khusus untuk edit dan mengambil data yang ada untuk ditampilkan.

Kita juga telah memiliki route dengan parameter yang akan kita gunakan.

| | GET|HEAD | posts/{post}/edit | posts.edit | App\Http\Controllers\PostController@edit | web |

Kita mulai membuat halaman edit. Silahkan buat file baru dengan nama edit.blade.php di folder views > post dan copas html dibawah ini.

//views/post/edit.blade.php
@extends('layouts.app')
@section('title', 'Post Edit')
@section('content')
<div class="wrapper">
  <h1>Edit Post</h1>
  
  @if (session('success'))
  <div class="alert-success">
    <p>{{ session('success') }}</p>
  </div>
  @endif
  
  @if ($errors->any())
  <div class="alert-danger">
    <ul>
      @foreach ($errors->all() as $error)
      <li>{{ $error }}</li>
      @endforeach
    </ul>
  </div>
  @endif
  
  <form method="POST" action="{{ url('posts', $post->id ) }}">
    @csrf
    @method('PUT')
    <input name="title" value="{{ $post->title }}" type="text" placeholder="Title..."> 
    <input name="body" value="{{ $post->body }}" type="text" placeholder="Body...">
    <button class="btn-blue">Submit</button>
  </form>
</div>
@endsection

Mari lihat pada form diatas. Karena html forms tidak mendukung method PUT dan yang telah digunakan route update, kita menggunakan POST untuk mengirim permintaan dan tetap menggunkan PUT yang dikirim dengan hidden method.

Selanjutnya kita buka PostController.php dan pada edit() dan update() method silahkan dibuat seperti dibawah ini.

public function edit($id)
{
   $post = Post::findOrFail($id);
   
   return view('post.edit', [
          'post' => $post
   ]);
 }

public function update(Request $request, $id)
{
  $request->validate([
     'title' => 'required|unique:posts|max:150',
     'body' => 'required', 
  ]);
        
  $post = Post::find($id)->update($request->all()); 
         
  return back()->with('success',' Data telah diperbaharui!');
}
Tutorial CRUD Laravel 8 - MySQL Database

Silahkan coba untuk melakukan edit data di halaman edit dengan url http://localhost:8000/posts/{ID}/edit.

Hapus Data

Kita juga menggunkan parameter untuk menentukan data mana yang akan di hapus. Kita tidak membutuhkan halaman khusus untuk memilih data / post lalu menghapusnya.

Kita hanya akan menambahkan route permintaan ke setiap data yang ditampilkan dan mengambil ID dari data tersebut sebagai argument.

Kita akan menggunkan DELETE method pada route yang digunakan. Dan seperti halnya method PUT yang tidak dapat digunkan untuk permintaan http pada form, kita juga akan menggunkaan / mengirim hidden method untuk DELETE.

Pada button 'Hapus' di halaman posts silahkan buat seperti dibawah ini; kita tambahkan juga session dan route di button edit.

...
<div class="wrapper">
<h1 style="text-align: center;">Semua Post</h1>
@if (session('success'))
    <div class="alert-success">
       <p>{{ session('success') }}</p> 
    </div>
@endif
...
@foreach ($posts as $post)
<tr>
  <td style="width: 200px" >{{ $post->title}}</td>
  <td  style="width: 500px" >{{ $post->body }}</td>
  <td style="width: 100px"><button class="btn-green"><a href="{{ route('posts.edit', $post->id) }}">Edit</a></button></td>
  <form method="POST" action="{{ url('posts', $post->id ) }}">
    @csrf
    @method('DELETE')
    <td style="width: 100px"><button class="btn-red">Hapus</button></td>
  </form>
</tr>
@endforeach

Kemudian pada PostController.php di destroy() method silahkan buat seperti dibawah ini.

public function destroy($id)
{
   $post = Post::find($id);

   $post->delete();

   return back()->with('success',' Penghapusan berhasil.');
}

Langkah terakhir tinggal mencobanya.

Tutorial CRUD Laravel 8 - MySQL Database

Selesai

Aplikasi crud laravel 8 telah selesai dibuat, semua fungsi telah dikerjakan. Semoga bermanfaat dan silahkan dikembangkan.

Tambahan: silahkan lihat Cara Install Bootstrap di Laravel 8 jika ingin menggunakan css bootstrap untuk komponen tabel, button dan lainnya.

Source Code

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel

Berlangganan

Berlangganan untuk mendapat pemberitahuan artikel terbaru via email.