Skill Level
Intermediate
Categories
Web Development
Reading Time
16 minutes, 28 seconds
Technology
PHP
Framework
Laravel
Library
No library
Teach Me Laravel Pt.5 – Migrations, Model dan Eloquent

Sebelumnya kita sudah membahas tentang controller pada Laravel dan saya asumsikan kamu sudah paham dengan konsep controller pada Laravel.

Hari ini kita akan membahas dan memahami tentang migrations, model dan eloquent pada Laravel.

Let’s go …

Introduction

Migrations dan eloquent adalah fitur Laravel yang akan memudahkan pekerjaan kamu dan bukan hanya itu, antara migrations, model dan eloquent itu ada hubungannya walaupun yang hubungannya sangat erat yaitu model dan eloquent, tapi kita akan coba bahas ketiganya.

Migrations

Menurut dokumentasi resminya, “Migrations are like version control for your database, allowing your team to easily modify and share the application’s database schema. Migrations are typically paired with Laravel’s schema builder to easily build your application’s database schema. If you have ever had to tell a teammate to manually add a column to their local database schema, you’ve faced the problem that database migrations solve.

Jadi, dengan migrations kamu tidak perlu repot-repot lagi membuat tabel, menambah kolom dan lain sebagainya secara manual, sebab kamu bisa melakukannya dengan migrations. Melakukan aktivitas seperti menambah dan menghapus kolom secara manual pada local database schema kamu maka bukan hal yang perlu dikhawatirkan jika kamu bekerja secara individu. Tapi, bagaimana jika kamu bekerja secara tim dan kamu melakukan aktivitas tadi sedangkan rekan satu tim kamu tidak mengetahuinya, mungkin akan terjadi error pada layar mereka. Nah, disinilah peran migrations.

Migrations pada Laravel berbentuk class yang akan membantu kamu untuk membuat tabel, alter table, drop table dan lain sebagainya. Membuat sebuah migrations dapat dilakukan dengan menggunakan perintah berikut pada CMD/Terminal.

php artisan make:migrations nama_aktivitas --create=nama_tabel

Semua file migrations yang telah digenerasi oleh perintah di atas akan tersimpan di dalam folder database/migrations. 

Kita asumsikan akan membuat tabel dengan nama products, maka perintahnya seperti berikut:

php artisan make:migration create_products_table --create=products

Hasilnya akan seperti berikut:

<?php

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Kita asumsikan tabel products memiliki struktur seperti berikut:

+--------------+------------------+------+-----+-----------+----------------+
| Field        | Type             | Null | Key | Default   | Extra          |
+--------------+------------------+------+-----+-----------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL      | auto_increment |
| name         | varchar(255)     | NO   |     | NULL      |                |
| price        | varchar(50)      | NO   |     | NULL      |                |
| details      | longtext         | NO   |     | NULL      |                |
| quantity     | int(10) unsigned | NO   |     | NULL      |                |
| created_at   | timestamp        | YES  |     | NULL      |                |
| updated_at   | timestamp        | YES  |     | NULL      |                |
+--------------+------------------+------+-----+-----------+----------------+

Maka jika dilakukan dengan menggunakan kode SQL maka kodenya akan terlihat seperti berikut:

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `price` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `details` longtext COLLATE utf8_unicode_ci NOT NULL,
  `quantity` int(10) unsigned NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Tapi, karena kita akan melakukannya menggunakan migrations maka ceritanya akan berbeda. Kembali ke kode migrations.

<?php

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Terlihat pada kode di atas terdapat 2 method yaitu up dan down. Method up digunakan untuk membuat tabel, menambah kolom dan lain sebagainya. Sedangkan method down kebalikan operasi dari method up.

Kamu juga dapat melihat kode $table->increments('id'), kode tersebut merupakan instruksi untuk membuat kolom dengan id beratribut auto_increment. Sedangkan kode $table->timestamps() adalah instruksi untuk menambah kolom created_at dan updated_at.

Agar membuat struktur tabel terlihat seperti yang telah kita asumsikan sebelumnya, maka kita memerlukan instruksi-instuksi lain untuk membuat kolom-kolom yang sesuai dengan struktur tersebut.

Karena kolom id, created_at dan updated_at sudah ada instruksinya, maka kita hanya perlu membuat 4 instruksi lagi untuk membuat kolom name, price, details dan quantity. Keempat kolom tersebut memiliki jenis data yang berbeda yaitu varchar, longtext dan int. Cara mendefinisikan instruksi dengan jenis kolom tadi pada Laravel migrations seperti berikut:


Jenis Migrations
varchar $table->string('nama_kolom')
longtext $table->longText('nama_kolom')
integer $table->integer('nama_kolom')

Untuk membuat struktur tabel seperti yang kita asumsikan maka keseluruhan kode migrations untuk tabel products akan terlihat seperti berikut:

<?php

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('price');
            $table->longText('details');
            $table->integer('quantity');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Selanjutnya, kita perlu mengeksekusi kode migrations tersebut. Tapi, sebelumnya kita perlu membuat database dan mengatur detail koneksi database yang kita gunakan pada file .env.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_pengguna
DB_PASSWORD=kata_sandi

Setelah membuat dan mengatur koneksi database, maka sekarang saatnya mengeksekusi file migrations yang baru saja kita buat. Untuk mengeksekusinya, kita dapat menggunakan perintah seperti berikut pada CMD/Terminal.

php artisan migrate

Jika berhasil, maka akan terdapat beberapa tabel baru pada database kamu dan akan menampilkan output sekiranya seperti berikut:

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_02_18_213233_create_products_table
Migrated:  2018_02_18_213233_create_products_table

Jika gagal, coba pergi ke halaman ini. Kemungkinan error yang kamu alami sama dengan yang ada pada halaman tersebut.

Bagaimana, sudah paham tentang migrations? Jika belum, coba baca ulang sampai kamu paham, karena selanjutnya kita akan membahas model. 

Model

Model dan migrations pada Laravel adalah 2 hal yang sifatnya berbeda. Model sifatnya wajib ada ketika kita ingin melakukan interaksi dengan tabel karena mengingat Laravel memiliki konsep arsitektur MVC dan walupun kita bisa melakukan interaksi dengan cara lain itu akan menjadi bad practice tentunya. Sedangkan migrations adalah fitur dari Laravel dengan definisi dan kegunaan yang telah kita bahas sebelumnya. Jadi, walaupun tidak ada fitur migrations kita masih bisa membuat tabel, menambah kolom dan lain sebagainya dengan cara manual dengan local database schema misalnya. Sudah paham? Oke, mari kita lanjutkan.

Setiap model pada Laravel mewakili satu tabel pada database dan model berguna untuk berinteraksi dengan tabel. Berinteraksi seperti apa? Seperti pada umumnya, melakukan query pada tabel, insert data, update, delete dan lain sebagainya.

Semua model pada Laravel tersimpan di dalam folder app. Tapi, kamu dapat menyimpannya di dalam folder lain asalkan dapat di-load oleh Composer.

Sama halnya seperti controller, untuk membuat model juga kita dapat menggunakan perintah melalui CMD/Terminal.

php artisan make:model NamaModel

Misal, kita ingin membuat model dengan nama Product. Maka perintahnya seperti berikut:

php artisan make:model Product

Semua model yang berhasil tergenerasi oleh perintah tersebut, maka berada di dalam folder app/. Berikut ini adalah isi dari file app/Product.php.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}

Apakah cukup seperti itu? Tentu saja belum selesai. Kita baru saja membuat model, tapi belum memberitahu tabel mana yang harus dioperasikan oleh model tersebut.

Kita perlu mendefinisikan kepada model tersebut nama tabel yang akan dioperasikannya.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = "products";
}

Pemberian nama tabel pada Laravel sedikit berbeda dengan nama model itu sendiri. Nama model bersifat singular(tunggal), sedangkan nama tabel bentuk plural(jamak) dari nama model tersebut.

Setiap tabel pada database memiliki kolom-kolom bukan? Apakah perlu mendifinisikan kolom-kolom pada tabel yang digunakan pada model tersebut? Lalu, jika perlu bagaimana cara mendefinisikannya?

Seperti yang telah saya beritahu diawal, bahwa setiap model mewakili satu tabel yang ada di-database. Jadi, bukan hanya nama tabel yang perlu didefinisikan pada model tersebut, melainkan nama kolom-kolom yang ada ditabel tersebut. Tapi, tidak semua nama kolom perlu kita definisikan, kita hanya perlu mendefinisikan kolom-kolom yang perlu diisi secara manual nilainya. Bingung? Mari kita asumsikan tabel products memiliki struktur seperti yang telah kita buat sebelumnya yaitu seperti berikut:

+--------------+------------------+------+-----+-----------+----------------+
| Field        | Type             | Null | Key | Default   | Extra          |
+--------------+------------------+------+-----+-----------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL      | auto_increment |
| name         | varchar(255)     | NO   |     | NULL      |                |
| price        | varchar(50)      | NO   |     | NULL      |                |
| details      | longtext         | NO   |     | NULL      |                |
| quantity     | int(10) unsigned | NO   |     | NULL      |                |
| created_at   | timestamp        | YES  |     | NULL      |                |
| updated_at   | timestamp        | YES  |     | NULL      |                |
+--------------+------------------+------+-----+-----------+----------------+

Sebelumnya, saya ingin memberitahu bahwa pada Laravel kita perlu membuat 2 kolom tambahan pada tabel yaitu created_at dan updated_at. Kolom created_at nantinya diisi otomatis oleh core Laravel dengan nilai waktu saat record tersebut di-insert. Sedangkan kolom updated_at nantinya akan diisi dengan nilai saat record tersebut di –update.

Back to topic, jika melihat struktur di atas maka menurut kamu kolom mana saja yang akan diisi secara manual nilainya? Ya, kolom yang akan diisi secara manual nilainya adalah kolom name, price, details dan quantity. Kenapa kolom id tidak termasuk? Karena, kolom id memiliki atribut auto_increment dan tentu kamu sudah tahu artinya.

Jadi, bagaimana untuk mendefinisikan kolom-kolom tersebut ke dalam model. Mudah saja, kita hanya perlu menuliskannya dalam bentuk array.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = "products";
    protected $fillable = ["name", "price", "details", "quantity"];
}

Sekarang, model Kamu sudah dapat berinteraksi dengan tabel yang terkait dengan model tersebut.

Eloquent

Laravel memiliki sebutan atau nama sendiri untuk ActiveRecord implementation yaitu Eloquent. Melalui eloquent kita dapat dengan mudah berinteraksi dengan tabel yang terkait pada model/eloquent tersebut. Berikut ini saya akan berikan sedikit contoh cara penggunaan eloquent dan untuk menggunakan eloquent kita cukup menggunakan nama model.


Fungsi Deskripsi
Product::all() Untuk mendapatkan semua record
Product::find(1) Untuk mendapatkan record dengan id=1
Product::whereName('Handphone')->get() Untuk mendapatkan record dimana kolom nama = ‘Handphone’

Tabel diatas hanya contoh kecil untuk penggunaan eloquent. Kamu juga dapat melakukan interaksi lain dengan tabel melalui eloquent seperti insert, update, delete, join dan lain sebagainya.

Selanjutnya, kita akan mencoba beberapa method yang tersedia pada eloquent dengan menggunakan Laravel tinker. Untuk memulai menjalankan tinker, gunakan perintah berikut:

php artisan tinker

Setelah tinker berjalan maka jalankan kode PHP berikut untuk dapat menggunakan model yang telah kita buat pada tinker.

use App\Product;

Hal pertama yang akan kita lakukan adalah memasukkan record baru ke tabel product melalui eloquent, maka gunakan perintah berikut untuk melakukannya:

Product::create(['name' => 'Product 1', 'price' => 10000, 'details' => 'Lorem ipsum', 'quantity' => 10 ])

Jika berhasil, maka akan menampilkan output seperti berikut:

=> App\Product {#766
     name: "Product 1",
     price: 10000,
     details: "Lorem ipsum",
     quantity: 10,
     updated_at: "2018-02-18 23:09:11",
     created_at: "2018-02-18 23:09:11",
     id: 1,
   }

Create adalah method yang tersedia pada eloquent dan berfungsi untuk melakukan insert record ke dalam tabel yang terkait dalam model tersebut. Method create diisi dengan parameter array yang berisi nama kolom beserta nilainya.

Kemudian, insert record baru dengan cara serperti sebelumnya hanya saja nama produknya berbeda. Sekarang, kita punya 2 data produk di dalam tabel products.

Kita akan mencoba method lain dari eloquent yaitu find(), method ini untuk mencari record yang memiliki nilai id yang sama dengan nilai yang diberikan pada parameter. Sebagai contoh, kita akan mengambil data record dari produk dengan id 2.

Product::find(2)

Ketika method di atas dijalankan maka yang akan muncul adalah data produk yang memiliki id = 2. Begitu juga jika kita ubah angka 2 menjadi angka yang lain maka data yang akan ditampilkan adalah data yang memiliki nilai id yang sama dengan nilai yang telah ditentukan tersebut. Paham?

Untuk pembahasan mengenai eloquent saya rasa cukup sampai di sini, karena kamu hanya tinggal mencoba method-method lain yang tersedia pada eloquent.

Final Words

Artikel ini sudah menjelaskan mengenai migrations, model dan eloquent. Semoga kamu sudah paham, karena pada artikel selanjutnya kita akan membahas tentang view. Semoga bermanfaat.

Topik:

Muhamad Nauval Azhar
9 months ago  •  Posted by
Muhamad Nauval Azhar
Junior Programmer

Pecinta Alam (Mbah dukun)

Dapatkan notifikasi untuk setiap artikel baru dan jadilah yang pertama tahu!