Kita akan pelajari bersama bagaimana cara menyimpan data ke database MySQL di laravel. Kita akan membuat form input untuk menyimpan data melalui browser, dan melihat juga bagaimana menggunakan postman untuk testing insert data record.
Tutorial ini teruntuk yang sedang mempelajari laravel.
Terdapat beberapa software / aplikasi yang kita butuhkan untuk dapat di install; berikut diantaranya:
- Composer / Laravel Installer
- XAMPP
- Postman
- Visual Studio Code, atau kode editor lainnya
- Chrome / Firefox
Instalasi Laravel
Mari kita awali dengan menginstal laravel. Silahkan gunakan metode penginstalan baik composer atau laravel installer.
Instalasi melalui composer
composer create-project laravel/laravel laravel-app
Instalasi menggunakan Laravel Installer
laravel new laravel-app
Setelah instalasi selesai, silahkan buka di code editor yang di gunakan.
Kita menggunakan laravel 8 untuk tutorial ini.
Membuat Database MySQL
Aktifkan MySQL server pada XAMPP Control Panel dan silahkan membuat database baru melalui phpmyadmin atau aplikasi desktop yang digunakan.
Cara cepat kita bisa gunakan command line:
create database laravel_app;
Lihat Cara Menjalankan MySQL di Command Line jika ingin menggunakannya.
Menghubungkan Database
Setelah database dibuat, selanjutnya kita mengatur environment mengbungkan aplikasi dengan database.
Buka file .env
pada project dan atur seperti dibawah ini:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_app DB_USERNAME=root DB_PASSWORD=
Membuat File Migrasi Baru
Selanjutnya kita buat file migrasi baru untuk membuat tabel pada database. Sebagai contoh kita akan membuat tabel Posts
.
php artisan make:migration create_posts_table
Perintah diatas hanya akan membuat file migrasinya saja. Karena kita akan berinteraksi dengan database ke tabel tersebut, kita juga membutuhkan sebuah Model dari tabel tersebut. Jadi kita membutuhkan model.
Untuk Membuatnya guanakan perintah berikut:
php artisan make:model Post
Cara cepat:
Kita juga bisa membuat file migrasi beserta model nya dengan sekali perintah; sebagai berikut:
php artisan make:model Posts --migration
Perintah --migration
juga bisa disingkat -m
.
Menambahkan Field Pada File Migrasi
Selanjutnya setelah file migrasi untuk tabel posts dibuat, kita tambahkan beberapa field yang dibutuhkan.
Sebagai contoh kita tambahkan 2 field baru, yaitu title
dan body
.
Buka file migrasi pada direktori database > migrations > ..._create-posts-table.php lalu buat seperti dibawah ini.
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.
@2W7N9W3 ➜ 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 (675.11ms) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (556.95ms) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (741.98ms) Migrating: 2021_02_27_064548_create_posts_table Migrated: 2021_02_27_064548_create_posts_table (393.95ms)
Databse dan tabel posts telah kita buat.
MariaDB [laravel_app]> show tables; +-----------------------+ | Tables_in_laravel_app | +-----------------------+ | failed_jobs | | migrations | | password_resets | | posts | | users | +-----------------------+ 5 rows in set (0.001 sec) MariaDB [laravel_app]> 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.043 sec)
Membuat Controller
Mari kita lanjutkan dengan membuat sebuah Controller yang kita gunakan untuk menulis fungsi, permintaan, ataupun logika aplikasi kita.
Kita buat sebuah Controller baru dengan nama PostController
dengan perintah berikut:
php artisan make:controller PostController
Setelah terbuat, akan terletak pada direktori app > Http > Controllers > PostController.php.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class PostController extends Controller { // }
Terdapat juga opsi yang dapat kita gunakan apabila ingin menggunakan perouteran otomatis yang disediakan dengan beberapa method didalamnya, seperti metode untuk membuat CRUD (create, read, update, dan delete).
Perintahnya adalah sebagai berikut:
php artisan make:controller PostController --resource
Hanya menambahkan --resource
atau -r
di akhir perintah.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class PostsController extends Controller { public function index() { // } public function create() { // } public function store(Request $request) { // } public function show($id) { // } public function edit($id) { // } public function update(Request $request, $id) { // } public function destroy($id) { // } }
Pada tutorial ini kita gunakan perintah yang pertama tanpa opsi --resource
.
Laravel Eloquent
Sekarang kita akan mulai bekerja dengan Eloquent di laravel mengenai bagaimana berinteraksi dengan database khususnya melakukan insert data ke database pada tabel posts.
Ada dua cara yang bisa kita gunakan untuk menyimpan data record baru ke dalam database, yaitu dengan metode new Model;
atau dengan metode Mass Assignment
menggunakan method create
.
Untuk lebih jelasnya mari kita mencobanya.
Kita gunakan cara pertama terlebih dahulu. Kita buka PostController.php
dan buat seperti dibawah ini.
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Post; class PostController extends Controller { public function store(Request $request) { $post = new Post; $post->title = $request->title; $post->body = $request->body; $post->save(); } }
Yang kita lakukan diatas adalah pertama kita panggil Model Post use App\Models\Post;
untuk tabel Posts, kemudian kita buat method baru store()
yang dipanggil saat membuat request. Lalu kita buat instance new [nama model] new Post
dan menetapkan atribut sesuai nama field yang ingin kita gunakan, kemudian tutup dengan method save()
untuk mengirim data record ke database. Sedangkan untuk keterangan tanggal dan watku created_at
updated_at
akan otomatis ter-generate tanpa kita definisikan.
Kita bisa mengatur hanya satu atribut field saja apabila di database diatur NULL / nullable = YES.
Membuat Route
Selanjutnya yang akan kita buat adalah route url permintaan yang kita tujuan ke fungsi insert record pada kontroler kita.
Silahkan buka file route web.php
pada direkfori routes dan tambahkan route di bawah ini.
use App\Http\Controllers\PostController; Route::post('/post/create', [PostController::class, 'store']);
Disini kita mengatur route untuk permintaan post
route pada web.php
hanya sebagai contoh. Kenapa demikian, karena jika kita lihat pada folder routes terdapat dua file route yang memiliki kegunaan yang berbeda dan keamanan yang menggunakan middleware berbeda.
Tergantung seperti apa aplikasi yang ingin kita bangun mengenai permintaan url baik untuk public atau antarmuka web dan tidak, contohnya halaman admin atau restful api.
Insert Record Baru Menggunakan Postman
Setelah route dibuat, selanjutnya kita akan membuat request mencoba melakukan insert data record melalui postman untuk testing.
Namun sebelum kita membuat testing melakukan request, ada beberapa hal yang akan kita lakukan terlebih dahulu, seperti generate CSRF token
dan membuat output atau response yang akan kita lihat dalam bentuk json.
Pertama mari kita buka kembali PostController.php
dan tambahkan response json dibawah ini.
{ ... $post->save(); return response()->json($post, 200); }
Kemudian kita buat permintaan token CSRF (cross-site request forgery) untuk header; dimana token CSRF merupakan fitur keamanan dari route web.php
selain token sesi.
Kita akan melewati hal ini jika route tersebut kita buat pada file route api.php
, dan yang akan menggunakan prefix URI /api
seperti http://localhost:8000/api/post/create
.
Mari kita buka route web.php
dan tambahkan route dibawah ini.
Route::get('/token', function () { return csrf_token(); });
Sekarang buka postman dan kita buat request untuk menghasilkan token terlebih dahulu; seperti gambar dibawah.
Kita gunakan method GET
dan masukan url http://localhost:8000/token
kemudian kirim.
Setelah kita memiliki csrf token
yang muncul di response body, silahkan copy token tersebut dan buat request di tab baru seperti gambar dibawah.
Pertama kita gunakan method POST
dengan url http://localhost:8000/post/create
dan kita tambahakn header di menu Headers
dengan key X-CSRF-TOKEN
lalu silahkan paste token di bagian value.
Kemudian menuju ke menu Body dan buat seperti gambar dibawah ini lalu kirim. Gunakan method: POST
dan url: http://localhost:8000/post/create
.
Setelah dikirim dan berhasil, kita memiliki data record baru pada tabel posts.
MariaDB [laravel_app]> select * from posts; +----+---------+--------+---------------------+---------------------+ | id | title | body | created_at | updated_at | +----+---------+--------+---------------------+---------------------+ | 1 | Title 1 | body 1 | 2021-03-01 11:00:19 | 2021-03-01 11:00:19 | +----+---------+--------+---------------------+---------------------+ 1 row in set (0.001 sec)
Membuat Html Form Input
Sekarang kita beralih ke pembuatan html form setelah selesai mencoba insert data record baru melalui postman.
Kita akan membuat halaman dengan metode inheritance atau template warisan, dimana sebuah template akan digunakan sebagai parent atau induk.
Mari kita buat untuk lebih jelasnya.
Kita buat folder baru pada direktori views dengan nama layouts dan tambahkan file baru dengan nama app.blade.php, kemudian copas html dibawah ini.
//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> </head> <body> <div class="container"> @yield('content') </div> </body> </html>
Setelah itu kembali buat folder baru pada direktori views dengan nama post dan sebuah file dengan nama create.blade.php lalu copas html berikut.
//views/post/create.blade.php @extends('layouts.app') @section('title', 'Buat Post Baru') @section('content') <form method="POST" action="{{ url('post/create') }}"> @csrf <input name="title" type="text" placeholder="Title..."> <input name="body" type="text" placeholder="Body..."> <button>Submit</button> </form> @endsection
Html form diatas dibuat cukup sederhana hanya sebagai contoh, silahkan tambahkan css / style jika ingin menambahkan. Jika ingin menggunakan bootstrap lihat cara install bootstrap di laravel 8 untuk penginstalan dan penggunaan.
Mari kita lihat pada form tersebut.
Kita menggunakan method POST
untuk permintaan http dengan action ke route dengan URI post/create
. Kemudian karena memerlukan validasi csrf token untuk permintaan tersebut, kita tambahkan @csrf
yang ter-generate menjadi hidden input value. Lalu pada element input pastikan untuk menambahakn atribut name dengan properti atau field yang ada.
Setelah template halaman dibuat, kita tambahkan route di web.php
dan method baru pada PostController.php
.
//web.php Route::get('/post/create', [PostController::class, 'create']);
//PostController.php public function create() { return view('post.create'); }
Selanjutnya jalankan php artisan serve
pada terminal dan kita coba pada browser.
Silahkan buka http://localhost:8000/post/create
dan lakukan inspect halaman pada form; klik kanan > inspect untuk melihat hidden input value.
Sampai disini silahkan menboba untuk menyimpan data record baru melalui form yang telah dibuat.
MariaDB [laravel_app]> select * from posts; +----+---------+--------+---------------------+---------------------+ | id | title | body | created_at | updated_at | +----+---------+--------+---------------------+---------------------+ | 1 | Title 1 | body 1 | 2021-03-02 08:41:00 | 2021-03-02 08:41:00 | | 2 | Title 2 | body 2 | 2021-03-02 08:41:13 | 2021-03-02 08:41:13 | +----+---------+--------+---------------------+---------------------+ 2 rows in set (0.000 sec)
Karena response setelah data dikirim berupa json, kita akan melihatnya seperti gambar berikut.
Kita bisa ubah response untuk kembali ke halaman yang ada atau beralih ke halaman lain.
$post->save(); return back();
$post->save(); return redirect('/');
Menggunakan Mass Assigment
Seperti dibahas diawal, bahwa kita juga dapat menggunakan metode Mass Assignment
untuk menyimpan data. Metode ini memiliki keamanan yang berfungsi untuk melindungi properti kita dari tindakan yang tidak dinginkan dari luar seperti merubah atau mengambil data di database.
Mari mencobanya.
Pertama kita perlu menambahkan atribut atau field apa saja dari model yang ingin di gunakan secara massal menggunakan properti $fillable
di file model kita.
Silahkan buka model Post.php
dan buat seperti dibawah ini.
class Post extends Model { use HasFactory; protected $fillable = [ 'title', 'body' ]; }
Kemudian pada method store()
di PostController.php
silahkan ubah metode yang ada dengan metode create
seperti dibawah ini.
public function store(Request $request) { $input = $request->all(); $post = Post::create($input); return response()->json($post, 200); }
Silahkan simpan dan mencoba kembali membuat data baru.
MariaDB [laravel_app]> select * from posts; +----+---------+--------+---------------------+---------------------+ | id | title | body | created_at | updated_at | +----+---------+--------+---------------------+---------------------+ | 1 | Title 1 | body 1 | 2021-03-02 09:35:25 | 2021-03-02 09:35:25 | | 2 | Title 2 | body 2 | 2021-03-02 09:35:48 | 2021-03-02 09:35:48 | | 3 | Title 3 | body 3 | 2021-03-02 09:36:00 | 2021-03-02 09:36:00 | +----+---------+--------+---------------------+---------------------+ 3 rows in set (0.000 sec)
Selesai
Sampai disini kita telah selesai mempelajari bagaimana cara menyimpan data ke databse MySQL di laravel baik menggunakan postman untuk membuat request dan atau membuat html form input. Silahkan dipelajari dan dikembangkan.
Sumber: Dokumentasi Laravel