Laravel6.X填充假數(shù)據(jù)的factory(工廠), seeder(種子)等的詳細(xì)教程

我們在學(xué)習(xí)laravel的時候,會發(fā)現(xiàn)有填充假數(shù)據(jù)的factory和seed兩種機(jī)制,有時候我們不知道應(yīng)該用哪個,哪個用了更好等問題。那么我們現(xiàn)在就開始從易到難地解析下這兩個填充假數(shù)據(jù)的方法,并且講解幾個例子。
我們想填寫幾個數(shù)據(jù)到數(shù)據(jù)庫里,如何做呢?有三個選項,一個是可以直接插入,用php artisan tinker或者手動從數(shù)據(jù)庫里插入。當(dāng)然也可以在遷移文件里面寫數(shù)組的方式來。這個就很簡單了,不用贅述。

1.關(guān)于factory - factory是基于模型的,也就是說用模型文件來填充數(shù)據(jù)。當(dāng)我們安裝完laravel之后我們就會發(fā)現(xiàn),factory文件夾里面也就是database/migrations/factories/文件夾下面就有了填充用戶的基本的代碼。我們先把安裝完的laravel安裝上一個腳手架。依次運行一下以下的命令:

composer require "laravel/ui" --dev
php artisan ui vue --auth
php artisan migrate

上面的幾個命令我就不再贅述了,請大家參閱相關(guān)資料。我們直接進(jìn)入主題:
我們會在database/migrations/factories/文件夾下面發(fā)現(xiàn)一個UserFactory.php文件。里面的代碼如下:

/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
});

這里$factory是個全局變量,引入了user模型,還有faker這個填充假數(shù)據(jù)的類,還有Str,這個用于字符串生成的類。里面的數(shù)據(jù)生成邏輯已經(jīng)寫好了,所以我們只要運行一下就可以了。但是我們在哪里運行呢?有兩處可以運行,一個是在php artisan tinker里面,還有就是在database/migrations/seeds/DatabaseSeeder.php。運行的命令如下:

factory(\App\User::class)->create();

直接在tinker里運行這個代碼你就會發(fā)現(xiàn)用戶數(shù)據(jù)庫里多了一個數(shù)據(jù)。如果我們想生成多條數(shù)據(jù),例如1000個用戶,那么我們應(yīng)該怎么辦呢?我們可以提供factory方法另一個變量,也就是說多少條的變量。這樣便可以生成了。

factory(\App\User::class,1000)->create();

我們打開database/migrations/seeds/DatabaseSeeder.php這個文件的時候會發(fā)現(xiàn)在run()這個方法里這一行被注掉了,這個文件是干什么的呢?

$this->call(UsersTableSeeder::class);

這個文件其實是最終的執(zhí)行一個命令來填充多個數(shù)據(jù)表的節(jié)點,也就是說把所有的代碼放到這里,就可以用一條命令來填充所有的數(shù)據(jù)表了。這一行其實是針對Users這個表的,所以,有任何其他的填充數(shù)據(jù)的邏輯都可以寫在seeder里面。也就是在seeds這個文件夾下面的文件里,一般一個表對應(yīng)一個文件。我們在factory里是定義的數(shù)據(jù)填充邏輯,是針對模型的,而seeder是對應(yīng)表名的,也就是直接跟數(shù)據(jù)庫進(jìn)行交互。上面的運行命令如何在這個文件里執(zhí)行呢?其實就是一條命令:

php artisan db:seed

所以說,我們填充一個模型的步驟就是:

  1. 在工廠文件里定義填充類型和邏輯
  2. 要做seeder文件,也就是說用
php artisan make:seeder TablenameSeeder
  1. 在DatabaseSeeder.php里面插入命令,類似:
$this->call(UsersTableSeeder::class);  //可以在此換seeder名稱
  1. 執(zhí)行
php artisan db:seed

2.填充關(guān)系型數(shù)據(jù)庫

如果我們想對一個關(guān)系型數(shù)據(jù)庫進(jìn)行填充的話,如何做呢?例如有客戶表customers表和companies的兩張表格,customer表格里有一個字段叫company_id的字段,引用的是companies里面的id字段。所以在順序上我們需要先填充company,然后再填充customers表格。這樣才能引用到這個字段。我們還是按原來的步驟走,也就是4個步驟。

php artian make:factory CustomerFactory
php artisan make:factory CompanyFactory

在這里我們注意一下,factory一般是對應(yīng)模型名稱的,所以一般是單數(shù)。而seeder得話是復(fù)數(shù)的表名。
然后我們再做一個種子文件:

php artian make:seeder CustomersTableSeeder
php artisan make:seeder CompaniesTableSeeder

這里其實關(guān)鍵是要做CustomerFactory的company_id這個字段怎么填。

$factory->define(\App\Customer::class, function (Faker $faker) {
    return [
        'company_id' => factory(\App\Company::class)->create();
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail
    ];
});

在這里我們直接用了factory, 引入模型,有些人會問了它這個是ID啊,是的,因為我們在模型里定義了它的關(guān)系,所以在此我們直接便用factory方法便可以解決所有問題,ID也不用放。最后,我們要把這兩個種子文件的執(zhí)行命令放到DatabaseSeeder.php文件的run()方法里面。注意下它們順序。

$this->call(CompaniesTableSeeder::class);
$this->call(CustomersTableSeeder::class);

最后執(zhí)行下php artisan db:seed,這樣的話一個命令就可以填充多個關(guān)系型數(shù)據(jù)表了。

3.用遷移文件填充少量數(shù)據(jù)

我們填少量數(shù)據(jù)的時候可以直接用遷移文件,在遷移文件中寫下數(shù)組。此時要注意的是,這個遷移文件和我們制作數(shù)據(jù)庫結(jié)構(gòu)的遷移文件要分開,也就是說它是一個獨立的文件。例如這個文件:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class SeedCategoriesData extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        $categories = [
            [
                'name'        => 'VPN',
                'slug' => 'VPN',
            ],
            [
                'name'        => '郵箱',
                'slug' => 'emails',
            ],
            [
                'name'        => '社交',
                'slug' => 'social',
            ],
            [
                'name'        => '服務(wù)',
                'slug' => 'services',
            ],
        ];

        DB::table('categories')->insert($categories);
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}

執(zhí)行php artisan migrate的時候就執(zhí)行了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容