Pada tutorial laravel kali ini kita akan mempelajari bagaimana cara untuk men-generate data dummy pada Laravel 5. Hal ini sangat penting sekali, karena dalam hal testing fitur tertentu, kita membutuhkan data. Seperti fitur pagination, misalnya. Atau di saat yang lain kita ingin memeriksa performa database, relasi, dan lain sebagainya.

Kita mungkin bisa membuat fake data secara manual memanfaatkan laravel database seeder. Itu kalau datanya masih sedikit. Kita bisa buat satu-persatu. Tapi kalau datanya ratusan? ribuan? puluhan ribu? Apa iya kita mau membuat data dummy itu secara manual?!

Untungnya di laravel 5, fitur untuk men-generate data dummy ini sudah ada out of the box, jadi kita tidak perlu repot-repot untuk melakukannya.

Simak pembahasannya berikut ini!

Laravel Factory

Model Factory adalah fitur seksi dari laravel yang membolehkan kita untuk membuat fake model (atau fake data) dengan cepat dan praktis. Tugas kita hanya mendefinisikan "isi" dari setiap kolom dari tabel kita, lalu kita akan menemukan Laravel membuatkan data fake yang sesuai dengan apa yang kita inginkan.

Untuk membuat kita lebih paham, secara default laravel sudah menyediakan contohnya untuk kita. Buka file database/factories/UserFactory.php. Anda akan melihat kode program seperti ini:

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

Kita bisa mencoba menggunakan model factory di atas (yang sudah default ada) untuk men-generate data user secara fake dengan melakukan hal berikut:

  1. Jalankan perintah php artisan tinker
    $ php artisan tinker
  2. Panggil fungsi factory() dengan memasukkan model dan jumlah row yang kita inginkan
    >>> factory(\App\User::class, 10)->create()


Screenshot from 2017-10-21 21-34-25.png

Screenshot from 2017-10-21 21-34-29.png

Fungsi di atas akan membuat 10 row fake untuk tabel users. Ada pun untuk hanya membuat satu row saja, anda bisa memanggil helper factory() tanpa memasukkan parameter jumlah row. Seperti berikut:

>>> factory(\App\User::class)->create()

Maka ia akan membuat satu baris saja. Mudah bukan? Sekarang kita coba mempraktikkan membuat dan mendefinisikan Model Factory baru.

Buat Project Baru

Anggap kita akan membuat project toko online yang menjual buku. Maka kita butuh tabel books untuk menyimpan buku. Dan kita juga butuh untuk membuat data dummy-nya.

Buat projectnya dulu, dengan menulis perintah berikut:

laravel new toko-buku

Atau anda bisa baca artikel Cara install laravel di linux [Semua Distro] untuk membuatnya.

Copy file .env.example menjadi .env.

cp .env.example .env

Generate app secret key.

php artisan key:generate

Lalu hubungkan aplikasi kita dengan database yang sudah kita buat sebelumnya (kalau belum? ya bikin aja!).

Buat Tabel Buku dan Modelnya

Step selanjutnya adalah membuat table books untuk menyimpan data buku. Dan juga membuat modelnya sekalian.

php artisan make:model Book -m

Screenshot from 2017-10-22 08-52-57.png

Perintah di atas akan membuat untuk kita dua file. Yaitu app/Book.php sebagai model. Dan yang kedua adalah file database/migrations/XXXX_XX_XX_XXXXXX_create_books_table.php sebagai migrations.

Buka file migration yang baru kita buat di atas, lalu isi sebagaimana berikut:

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

class CreateBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title', 100);
            $table->string('author', 60);
            $table->string('publisher', 60);
            $table->longtext('description');
            $table->integer('price');
            $table->timestamps();
        });
    }

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

Pada terminal, jalankan perintah php artisan migrate.

Screenshot from 2017-10-22 12-54-08.png

Dan tabel books kita sudah berhasil terbuat.

Screenshot from 2017-10-22 12-55-31.png

Buat dan Definisikan Model Factory

Proses selanjutnya sebelum kita bisa men-generate data dummy pada tabel books adalah dengan membuat dan mendefiniskan Model Factory. Untuk membuatnya cukup mudah, kita bisa men-generate filenya dengan menggunakan php artisan.

php artisan make:factory BookFactory

Screenshot from 2017-10-22 12-58-37.png

Perintah di atas akan membuatkan file untuk kita di dalam folder database/factories.

Setelah itu kita bisa definisikan setiap kolom dari tabel kita untuk kemudian kita generate. Buka file database/factories/BookFactory.php lalu tambahkan kode berikut:

<?php

use Faker\Generator as Faker;

$factory->define(\App\Book::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence(3),
        'author' => $faker->name,
        'publisher' => $faker->sentence(2),
        'description' => $faker->text,
        'price' => $faker->randomNumber(5)
    ];
});

Eksekusi Model Factory

Sekarang setelah semuanya siap, kita bisa mengeksekusi model factory yang sudah kita buat di atas. Kita bisa mengeksekusinya secara sederhana melalui php artisan tinker seperti yang sudah dicontohkan sebelumnya, atau kita bisa juga mendefiniskan database seeder sendiri.

Pada kasus ini, saya akan mencobanya dengan php artisan tinker saja agar lebih cepat.

php artisan tinker

Panggil helper factory().

>>> factory(\App\Book::class)->create()

Itu akan men-generate satu buah baris di tabel books.

Screenshot from 2017-10-22 13-03-52.png

Kita coba men-generate lebih dari satu baris sebagaimana yang telah berlalu.

>>> factory(\App\Book::class, 100)->create()

Bagaimana? Mudah dan asik bukan? Sekian dulu tutorialnya. Kalau ada yang kurang jelas atau error bisa tulis di komentar. Sampai jumpa~