1. 程式人生 > >laravel5.5資料庫之資料填充(實踐)

laravel5.5資料庫之資料填充(實踐)

前要:laravel5.5資料庫遷移可以參考我的上一篇博文:laravel5.5資料庫遷移入門實踐

一、背景

        常常在做專案的過程中,會使用很多的測試資料,而因為團隊開發,如果每個人的測試資料都不一致,會出現各種測試問題,所以有必要對資料庫中的測試資料也進行開發過程中的版本控制。

        填充和遷移類似,都是通過類似於遷移檔案一樣的填充檔案來儲存資料和執行填充操作。

        填充資料有兩種方式,編寫seeder填充資料使用模型工廠填充資料

二、編寫seeder填充資料

1. 進入dos系統,跳轉到專案根目錄,執行 工具(artisan)命令 make:seeder

 來生成 Seeder,命令如下:

php artisan make:seeder GoodsTableSeeder

執行結果如下:

  

由框架生成的 seeders 都將被放置在 /database/seeds 目錄下:

  

檔案內容如下:

<?php

use Illuminate\Database\Seeder;

class GoodsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

檔案說明:一個seeder檔案只包含一個run方法,這個方法會在dos系統中執行 db:seed 命令時被呼叫執行,在run方法中可以寫入要插入的資料。

2.  編寫run方法,寫入待插入資料

    public function run()
    {
        DB::table('goods')->insert([
            'goods_name' => '電動牙刷',
            'goods_price'=> '120.23',
            'num'        => '30',
            'descr'      => '這是一條測試資料',
        ]);
    }

3. 執行插入資料命令

進入dos系統,執行插入資料命令之前,可能需要重新生成Composer自動載入器,命令如下:

composer dump-autoload

執行插入資料命令

php artisan db:seed --class=GoodsTableSeeder

dos結果如下:

 

資料庫結果如下:

三、使用模型工廠填充資料

在進行資料測試時,有時候需要批量生成資料,單個填充顯然不太方便,這時候有需要使用模型工廠填充資料。

1. 生成goods模型檔案

        為了方便檔案統一管理,我們統一把模型檔案放在/app/Models/資料夾下,這時候更改一下/config/auth.php下的配置,更改如下:

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,    // 此處更改為App\Models\User
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

注意:因為laravel5.5預設在app資料夾下有一個的User模型檔案,所以更改了配置後,如果有需要,可以再重新生成一個User模型檔案在Models中。

在dos系統中,跳轉到專案根目錄,執行命令開始生成goods模型檔案,命令如下:

php artisan make:model Models\Goods

2. 在工廠模型檔案(/database/factories/ModelFactory.php)中,對指定的欄位進行賦值,程式碼如下:

<?php

use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(\App\Models\Goods::class, function (\Faker\Generator $faker) {
    return [
        'goods_name'     =>    $faker->name, 
        'goods_price'    =>    $faker->numberBetween(100,3000),
        'num'		 =>    $faker->numberBetween(20,50),
        'descr'		 =>    $faker->text,
    ];
});

說明:$fake 例項能夠呼叫的屬性,也就是可以生成的資料內容,並非由使用者自定義,如 $fake->name 隨機生成一個名字,$fake->text 隨機生成一個文字,具體的細節,參考github上 PHP library Faker的Formatters部分,地址:https://github.com/fzaninotto/Faker#formatters

3. 生成goods對應的seeder檔案

進入dos系統,跳轉到專案根目錄,執行如下命令:

php artisan make:seed GoodsTableSeeder

執行成功後,檢視/database/seeds/資料夾下多出GoodsTableSeeder.php

  

4. 在GoodsTableSeeder.php檔案總的run方法寫入生成測試資料的程式碼,程式碼如下:

<?php

use Illuminate\Database\Seeder;

class GoodsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    	// 新增單條資料
        // DB::table('goods')->insert([
        //     'goods_name'    => '電動牙刷',
        //     'goods_price'   => '120.23',
        //     'num'           => '30',
        //     'descr'         => '這是一條測試資料',
        // ]);

    	// 新增10條測試資料
        $goods = factory(\App\Models\Goods::class,10)->make(); 
        \App\Models\Goods::insert( $goods->toArray() );
    }
}

注意:上面程式碼中新增單條資料是之前編寫seeder填充資料時寫入的,如果開啟這個註釋,註釋掉批量新增的程式碼,同樣可以重複新增這一條資料。

5. 在/database/seeds/DatabaseSeeder.php 裡面呼叫GoodsSeeder.php的類,程式碼如下:

<?php

use Illuminate\Database\Seeder;

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

6. 執行批量生成資料的命令

進入dos系統,跳轉至專案根目錄,執行以下命令:

php artisan db:seed

ok,批量填充資料也搞定!

結語:資料填充操作主要是用於開發階段進行資料版本控制和批量產生測試資料的作用,真正到開始運營專案後,這個就不能用了,否則幾十萬的資料儲存在專案檔案裡面,那就真的是開玩笑了……

如果看博文有什麼疑惑的地方,歡迎留言告知!