Membuat Database Seeder di Laravel dengan Faker

Mahir Koding – Membuat Database Seeder di Laravel dengan Faker – Beberapa bulan yang lalu, saya sudah pernah membuat postingan tentang bagaimana cara untuk membuat migration di Laravel. Sekedar review saja, migration merupakan salah satu fitur yang tersedia di Laravel untuk membantu kita dalam proses pembentukan database. Kenapa harus membuat database dengan migration? Alasannya simple saja, dengan menggunakan migration maka kita tidak perlu repot-repot membuka phpmyadmin. Selain itu, setiap perubahan yang kita lakukan terhadap table kita akan tersimpan dalam file migration yang kita buat. Ini akan sangat berguna jika teman-teman sudah terbiasa bekerja dengan version control.

Lalu, apa hubungannya migration dengan artikel yang akan saya bahas kali ini? Jika migration hanya digunakan untuk merancang database, maka seeder berguna untuk mengisi data ke table di database kita. Seed (menyemai) sering digunakan untuk mengisi data-data dummy ke table kita. Tujuannya agar kita sebagai developer dapat lebih mudah dalam mencoba program yang kita buat. Misalnya, kita ingin mencoba membuat fitur pagination, berarti kita harus mempunyai data yang banyak bukan? Apakah kita harus menginsert data satu per satu?

Untuk itulah, laravel sudah menyiapkan fitur yang sangat berguna ini. Kasus kedua, seandainya kamu ingin memindahkan program kamu ke PC lain, lalu membuat table dengan migration, maka kamu akan kehilangan semua data-data dummy yang kamu insert manual. Hal ini tentu saja membuat proses demonstration akan sangat ribet untuk dilakukan karena kita kekurangan data untuk “dicoba“.

Untuk membuat seeder, sebenarnya beberapa cara salah satunya adalah dengan melakukan insert manual. Dalam artikel ini, saya akan mencoba membuat seeder untuk tabel users default laravel dengan beberapa penambahan column.

Migration : create_users_table

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->string('address');
        $table->date('date_of_birth');
        $table->rememberToken();
        $table->timestamps();
});

Jika migration sudah dijalankan (table sudah ready), selanjutnya buatlah seeder dengan artisan. Contoh, jalankan command berikut di command line :

php artisan make:seeder UsersTableSeeder

Maka, akan terbentuk 1 file baru dengan nama UsersTableSeeder.php di dalam folder “database/seeds”.

Isinya sebagai berikut :

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

Sekarang, kita akan mendefinisikan data yang akan diinsert di dalam method run.

Sebagai contoh, kita akan mencoba membuat seeder sederhana dengan data statis yang kita definisikan sebelumnya secara manual.

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'User Testing 1',
            'email' => 'test1@gmail.com',
            'password' => bcrypt('password'),
            'address' => 'Sudirman Street',
            'date_of_birth' => '1945-08-17',
        ]);
    }
}

Lalu, kita jalankan seeder tersebut dengan command di bawah ini agar datanya terinsert ke database.

php artisan db:seed --class=UsersTableSeeder

Definisikan class seeder yang akan dijalankan dengan parameter –class=[nama class seeder] seperti contoh diatas.

Jika kamu memiliki banyak class seeder, kamu tidak perlu menjalankan satu per satu commandnya. Di Laravel, juga ada 1 class seeder dengan nama DatabaseSeeder di dalam folder “database/seeds”. Secara default, kalau kamu hanya menjalankan perintah “php artisan db:seed” maka file tersebutlah yang akan dijalankan. Dengan demikian, kamu bisa mendefinisikan semua class seeder yang akan dijalankan di file DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        //$this->call(ClassSeederLainnya::class);
    }
}

Jika menggunakan cara ini, berarti kita tidak perlu lagi memberikan parameter –class saat menjalankan perintah “php artisan db:seed”.

Setelah seeder dijalankan, kita bisa mengecek apakah datanya sudah berhasil terinsert atau belum.

seeder

Sampai tahap ini, seeder telah berhasil menginsertkan 1 data ke database. Jika ingin menginsert banyak data sekaligus, bisa diakalin dengan membuat looping di dalam seeder.

Next, dalam tutorial ini saya akan menjelaskan bagaimana caranya menggunakan Faker pada migration. Faker adalah sebuah package untuk laravel dimana kita dapat menginsertkan dummy data yang sesuai dengan tipenya. Faker dapat merandom dummy data sesuai dengan preferensi datanya. Misalnya, data untuk alamat, data tanggal, data nama orang, data nomor rekening, dan lain sebagainya.

Install Faker, jalankan command berikut di command line untuk menginstall faker.

composer require fzaninotto/faker

Jika sudah, sekarang kita modif file UsersTableSeeder tadi menjadi :

<?php

use Illuminate\Database\Seeder;
use Faker\Factory as Faker;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        $faker = Faker::create();
        foreach(range(0,10) as $i){
            DB::table('users')->insert([
                'name' => $faker->name,
                'email' => $faker->email,
                'password' => bcrypt('password'),
                'address' => $faker->address,
                'date_of_birth' => $faker->dateTimeThisCentury()->format('Y-m-d')
            ]);
        }
    }
}

Lalu, jalankan ulang seedernya. Berikut adalah hasil data yang dihasilkan oleh faker :

seeder""

Dannn, masih banyak lagi tipe-tipe data yang dapat kamu hasilkan dengan faker, bahkan NIK (Nomor Induk Kependudukan) juga bisa dirandom dengan faker. Cek dokumentasinya di github : https://github.com/fzaninotto/Faker

Note : Seeder yang kita contohkan diatas menggunakan DB RAW, sehingga column created_at tidak akan terisi secara otomatis. Silahkan gunakan eloquent jika ingin menginsertkan created_at secara otomatis atau jika kamu tetap ingin menggunakan DB RAW, isikan secara manual column created_at dengan waktu saat ini (Carbon\Carbon::now()).