لاراول: دو راه برای درج دیتای پیش فرض و رابطه دار

هنگام گذاشتن دیتا، خیلی پیش میاد که به ازای هر جدول در دیتابیس یک کلاس داشته باشیم. اما چه اگر با هم رابطه داشته باشند، چه؟ من برای این کار دو راه به شما یاد خواهم داد.

فرض کنید ما یک دیتابیس ساده با این مشخصات داشته باشیم:


جدول های contacts و contact_companies که یک رابطه 1 به N با هم دارند.

حالا چگونه در دو جدول دیتای پیش فرض درج کنیم؟

البته که ما از کتابخانه Faker استفاده خواهیم کرد، گرچه برای این کار راههای دیگری هم هست.

ابتدا ما 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,
    ];
});

و 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,
    ];
});

همینطور که می بینید، ما هیچ contacts.company_id را تعریف نکرده ایم. خب اینجا ما چند گزینه داریم:

روش اول: ایجاد contact در seed مربوط به company

ابتدا برای company یک seeder ایجاد می کنیم:

php artisan make:seeder CompanySeed

سپس فایل database/seeds/CompanySeed.php را مانند زیر پر می کنیم:


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

در کل، ما ۱۰ کمپانی ایجاد کردیم که به ازای هر کمپانی، یک contact هم با استفاده از رابطه Eloquent در app/ContactCompany.php نیز ساختیم.


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

روش دوم: ساخت company و در کنارش contact

راه دیگر این است که از seed برای contact استفاده کنید.

php artisan make:seeder ContactSeed

و سپس اضافه کردن این خط در فایل database/seeds/ContactSeed.php:


public function run()
{
    factory(App\Contact::class, 10)->create();
}
شما احتمالا تعجب کردید که این روابط از کجا می آیند؟ ما می توانیم مستقیما در factory هم یک parent ایجاد کنیم. به شکل زیر:

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,
    ];
});

فیلد اول را ببینید، ما از یک factory پدر استفاده کردیم تا یک company بسازیم. خیلی ساده!!!

در داکیومنت سایت لاراول شما می توانید اطلاعات بیشتری راجع به seeding و استفاده از factory با Faker بدست بیاورید.

کامنت ها (0)

ارسال نظر