Mengetahui Hubungan Seeder dan Factories - Dunia Laravel




Database isinya itu ada DDL (Data Definition Language) dan DML (Data Manipulation Language). Di artikel yang sebelumnya, kita udah belajar gimana caranya buat DDL atau struktur databasenya.

Sekarang di artikel ini kita bakal isi tablenya dengan isi isi-an. Tapi yang kita buat sekarang bukanlah CRUD. Kita akan mencoba fitur laravel yang bernama “Seeding”.



Table of Contents


  • What is Seeding?
  • How to Use?
  • Create Seeder and Factories
  • What's Next?

What is Seeding?


Seeding itu proses pengisian table pada database kalian menggunakan isi isi-an atau bisa di bilang data dummy. Tapi isinya ini bukan sembarang isi. Seeding bukan cuma asal random string atau number. Seeding juga bisa random data yang mendekati real dengan bantuan dari model factories.
Jadi di sini nanti kita mau coba buat Seeding sama Factories. Kalian bisa lihat file nya di database/seeds dan database/factories. Di sana kalian udah punya DatabaseSeeder.php dan UserFactory.php yang merupakan file bawaan dari laravel saat kalian buat project.



How to Use?


Cara buat file seeder bisa pake perintah artisan
php artisan make:seeder FileSeeder

Perintah artisan diatas nanti bakal ngebuat file seeder bernama ‘FileSeeder.php’. Tapi sekarang kita ga akan pake file baru. Kita akan coba-coba pake file ‘DatabaseSeeder.php’ yang udah ada.

Ada beberapa cara buat input data ke database pake seeder. Yang pertama dengan cara manual atau input satu per satu.
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'email_verified_at' => now(),
            'password' => Hash::make('password'),
            'remember_token' => Str::random(10),
        ]);
    }

Code diatas kalian masukin di bagian fungsi run() punya DatabaseSeeder.php . Dari code itu akan dibuat nama dengan random 10 karakter string, email dengan random 10 karakter string ditambah ‘@gmail.com’, dan seterusnya. Untuk menjalankan seeder ini kita bisa pake

php artisan db:seed

php artisan db:seed --class=UserSeeder

Perintah --class di pake buat menspesifikasikan class seeder mana yang mau di run atau di gunakan. Kalo ga pake --class secara otomatis seeder yang di jalankan adalah DatabaseSeeder.php. Pastikan database kalian aktif ya… Kalo sukses kalian bisa coba cek di localhost database kalian.

Itu masukinnya emang harus satu-satu? Yup, kalo pake cara kaya gitu harus satu per satu. Tapi laravel tahu kalo cara gitu ngerepotin. Jadi dia bikin cara lain yang bisa bantu input banyak data sekaligus. Sekaranglah saatnya kita coba model factories.

Sama kaya seeder, kita coba pake factory yang sebelumnya udah dibuat sama laravel yang ada di folder database/factories. Tapi kalo mau pake ini kalian juga harus punya model yang ada di folder App/. Di situ udah ada model yang namanya User.php, model ini yang nantinya kita pake.

Disana udah ada codenya buat input data user. Kalian cuma tinggal panggil factorynya di file seeder kalian.

    public function run()
    {
        factory(\App\User::class, 10)->create();
    }

Code diatas bisa kalian masukin di file DatabaseSeeder.php gantiin code yang sebelumnya. Coba kalian jalanin lagi perintah artisannya. Kalo sukses data di database kalian pasti nambah 10.


Kalian bisa perhatikan kalo data yang di generate bukan data sembarang lagi kaya yang di row 1. Kenapa bisa gitu? Karena pada file factories ada package faker. Package ini yang ngebuat data dummy itu jadi keliatan agak real.





Create Seeder and Factories


Kalian udah ada gambaran seeder sama factories kan… sekarang coba kita buat punya kita sendiri. Di sini aku pake database yang sebelumnya udah dibuat di artikel migration. Jadi aku udah punya table materi, dan table materi ini yang nanti aku buat seeder sama factoriesnya.

Pertama hal yang perlu kita siapin adalah modelnya. Kalian bisa buat model pake perintah artisan.

php artisan make:model Materi

Perintah itu nanti bakal ngebuat model materi. Coba kalian buka filenya trus masukin kode berikut buat ngedefinisiin table yang mau di pake.

class Materi extends Model
{
    protected $table='materi';
}

Setelah itu kita buat factories-nya pake perintah artisan juga.

php artisan make:factories MateriFactory

Perintah itu nantinya bakal ngebuat factories dengan nama ‘MateriFactory’. Langsung aja kita buat factories-nya.

use App\Materi;
use App\User;
use Faker\Generator as Faker;

$factory->define(Materi::class, function (Faker $faker) {
    $users = User::all()->toArray();
    $rand = rand(1,10);

    return [
        'judul' => $faker->sentence,
        'pengarang' => $users[$rand]['name'],
        'tipe' => $faker->word,
        'deskripsi' => $faker->text($maxNbChars = 100),
        'tgl_publish' => now(),
        'user_id' => $users[$rand]['id'],
    ];
});

Code kali ini agak ribet disbanding yang bawaan laravel tadi karena table yang ada itu menggunakan foreign key. Jadi otomatis data yang diambil harus berasal dari table yang lainnya, ga bisa asal input.

Pertama package tambahan yang di pake ada model Materi dan model User. Model User di pake buat ambil data ‘nama’ nya buat di jadiin ‘nama pengarang’ di table ini. Kemudian itu juga berfungsi buat cari id user.

Selanjutnya adalah pembuatan seeder. Buat seeder pake nama ‘MateriSeeder’.

php artisan make:seeder MateriSeeder

Isi dari ‘MateriSeeder’ cukup simple… yaitu

    public function run()
    {
        factory(\App\Materi::class, 10)->create();
    }

Tidak jauh beda dengan seeder user tadi, hanya mengganti di bagian nama modelnya yang tadinya ‘User’ jadi ‘Materi’.

Kalo udah lengkap, kita tinggal jalanin perintah artisan

php artisan db:seed --class=MateriSeeder

Kalo sukses kalian bisa langsung cek di localhost database kalian.


Jadi 2 hal ini biasanya di pake buat testing data. Misal suatu ketika kalian perlu mencoba proses get data namun ternyata belum ada data di database maka kalian bisa pake cara ini.

Karena cara ini di pake buat testing aja… Cara ini bukanlah cara wajib yang perlu kalian ikutin kalo mau buat CRUD. Tapi ini bisa menambah cepet kerja kalian.




What’s Next?

Kamingsun

Komentar

Postingan Populer