Our blog

Dua cara menggunakan Seed pada relasi di Laravel

 

Latest Blog's

Dua cara menggunakan Seed pada relasi di Laravel

Laravel     3 weeks ago


Saat kita menggunakan data seeding, pada umumnya kita menggunakan satu class untuk masing-masing tabel. Lalu bagaimana jika terdapat relasi antar tabel?

Disini akan kita contohkan menggunakan 2 tabel yang saling berhubungan dengan nama contacts and contact_companies.

Bagaimana caranya untuk "seed data" kedalam 2 tabel tersebut?

Disini kita akan menggunakan Faker library, tetapi ada beberapa langkah untuk melakukannya

Pertama, kita tentukan terlebih dahulu factories.

database/factories/ContactCompanyFactory.php:

$factory->define(App\ContactCompany::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'address' => $faker->address,
        'website' => 'https://' . $faker->word . '.com',
        'email' => $faker->email,
    ];
});

Tambahkan database/factories/ContactFactory.php:

$factory->define(App\Contact::class, function (Faker\Generator $faker) {
    return [
        'first_name' => $faker->firstName(),
        'last_name' => $faker->lastName,
        'phone1' => $faker->phoneNumber,
        'phone2' => $faker->phoneNumber,
        'email' => $faker->email,
        'skype' => $faker->word,
        'address' => $faker->address,
    ];
});

contact.company_id belum kita definisikan. Yuk kita langsung coba dengan opsi pertama.

Version 1. Buat contacts didalam company seed

Ayo kita buat company seeder:

php artisan make:seeder CompanySeed

Lalu ubah file database/seeds/CompanySeed.php dengan ini:

public function run()
{
    factory(App\ContactCompany::class, 10)->create()->each(function ($company) {
        $company->contacts()->save(factory(App\Contact::class)->make());
    });
}

Kita membuat 10 companies, dan untuk setiap dari mereka kita membuat satu contact, menggunakan Eloquent relationship di app/ContactCompany.php:

public function contacts()
{
    return $this->hasMany(Contact::class, 'company_id');
}

Version 2. Buat company bersama contact

Pada cara kedua ini kita akan membuat seed untuk Contacts.

php artisan make:seeder ContactSeed

Lalu tambahkan 1 baris kode ini pada database/seeds/ContactSeed.php:

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

Mungkin kalian bertanya-tanya, darimana relasinya? Kita bisa membuat “parent” secara langsung factory! Seperti ini:

database/factories/ContactFactory.php:

$factory->define(App\Contact::class, function (Faker\Generator $faker) {
    return [
        'company_id' => factory('App\ContactCompany')->create()->id,
        'first_name' => $faker->firstName(),
        'last_name' => $faker->lastName,
        'phone1' => $faker->phoneNumber,
        'phone2' => $faker->phoneNumber,
        'email' => $faker->email,
        'skype' => $faker->word,
        'address' => $faker->address,
    ];
});

Coba perhatikan pada field pertama? Kita membuat parent factory dan membuat company “secara langsung”.

OK, bagaimana? Simpel kan?

Di official dokumentasi Laravel kalian bisa temukan lebih banyak informasi terkait seeding dan using factories with Faker.