دیتابیس: سیدینگ

لاراول 5.6.29 در حال تکمیل

مقدمه

لاراول با استفاده از کلاس‌های سید، روش ساده‌ای برای سیدکردن (خوراندن) داده تست به دیتابیس را ارائه می‌دهد. تمامی کلاس‌های سید در دایرکتوری database/seeds قرار دارند. کلاس‌های سید می‌توانند هر نامی را که می‌خواهید داشته باشند، اما شاید بهتر باشد که کانوِنشِن (الگوی قراردادی) مشخصی مانند UsersTableSeeder و غیره را دنبال کنید. به صورت پیش‌فرض، یک کلاس DatabaseSeeder برای پروژه شما تعریف شده است. داخل این کلاس، با استفاده از متد call می‌توانید سایر کلاس‌های سید را اجرا کنید، که به شما امکان کنترل ترتیب اجرای عملیات سیدینگ را می‌دهد.

نوشتن سیدرها

برای تولید یک سیدر، کامند آرتیزان make:seeder را اجرا کنید. تمامی سیدرهای تولید شده توسط فریمورک در دایرکتوری database/seeds قرار می‌گیرند.

php artisan make:seeder UsersTableSeeder

به صورت پیش‌فرض، هر کلاس سیدر تنها حاوی متد run است. این متد هنگامی که کامند آرتیزان db:seed اجرا شود، فراخوانی می‌شود. داخل متد run، هر داده‌ای که می‌خواهید می‌توانید به دیتابیس خود وارد کنید. با استفاده از کوئری بیلدر و یا الوکوئنت مدل فکتوری، می‌توانید داده‌ها را به صورت دستی به دیتابیس وارد کنید.

Mass assignment protection در هنگام سید کردن داده به دیتابیس به صورت خودکار غیرفعال می‌شود.

به عنوان یک مثال، بیایید کلاس پیش‌فرض DatabaseSeeder را ویرایش کرده و یک دستور ورود داده به دیتابیس را به متد run اضافه کنیم.

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

هر وابستگی را که می‌خواهید می‌توانید در سیگنِچِر متد run به صورت type-hint تزریق کنید. این وابستگی‌ها به صورت خودکار توسط سرویس کانتینر لاراول ریزالو می‌شوند.

استفاده از مدل فکتوری‌ها

طبیعتا، مشخص کردن اتریبویت‌ها برای تک‌تک سیدهای مدل، کاری خسته کننده است. به جاری اینکار، می‌توانید از مدل فکتوری‌ها برای تولید رکورد دیتابیس به تعداد زیاد استفاده کنید. ابتدا، داکیومنت مدل فکتوری را مطالعه کنید تا نحوه تعریف فکتوری‌ها را یاد بگیرید. هنگامی که فکتوری‌های خود را تعریف کردید، می‌توانید تز هلپر فانکشن factory برای ورود رکوردها به دیتابیس استفاده کنید.

برای مثال، بیایید 50 کاربر بسازیم و به هر کاربر یک ریلیشن‌شیپ اَتَچ کنیم:

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    factory(App\User::class, 50)->create()->each(function ($u) {
        $u->posts()->save(factory(App\Post::class)->make());
    });
}

فراخوانی سیدرهای اضافه

داخل کلاس DatabaseSeeder می‌توانید از متد call برای اجرای کلاس‌های سید اضافه استفاده کنید. با استفاده از متد امکان شکستن سیدینگ دیتابیس به چندین فایل را دارید تا با این کار هیچ کلاس سیدری خیلی بزرگ نشود. نام کلاس سیدری را که می‌خواهید اجرا شود را به این متد ارسال کنید:

/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        PostsTableSeeder::class,
        CommentsTableSeeder::class,
    ]);
}

اجرای سیدرها

هنگامی که سیدرهای خود را نوشتید، ممکن است نیاز به ایجاد مجدد اتولودر کامپوزر داشته باشید، این کار را با کامند dump-autoload می‌توانید انجام دهید.

composer dump-autoload

حالا می‌توانید از کامند آرتیزان db:seed برای سید دیتابیس خود استفاده کنید. به صورت پیش‌فرض، کامند db:seed، کلاس DatabaseSeeder را اجرا می‌کند که می‌تواند جهت فراخوانی کلاس‌های سید دیگر استفاده شود. با این وجود، با استفاده از آپشن --class می‌توانید یک کلاس سیدر مشخص را که می‌خواهید اجرا شود را مشخص کنید:

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

همچنین با استفاده از کامند migrate:refresh که مایگریشن‌های‌تان را رول‌بَک کرده و مجددا اجرا می‌کند، می‌توانید به دیتابیس خود سید بخورانید. این کامند برای ساخت مجدد دیتابیس به صورت کامل سودمند است:

php artisan migrate:refresh --seed