Laravel資料庫遷移和填充(支援中文)

TechLee發表於2019-02-16

寫在前面

經常我們做專案都團隊協作開發,每個人都在自己本地的資料庫,如果你曾經出現過讓同事手動在資料庫結構中新增欄位的情況,資料庫遷移可以解決你這個問題。

不僅如此,線上上部署的時候,也避免了手動匯入資料庫或手動修改資料結構的麻煩,資料遷移幫你方便的維護著資料結構。

資料填充,讓我們測試的時候需要大量的假資料不再一條一條的去造資料,可以輕鬆的批量填充大量資料。

本文基於Laravel5.5,其他版本大同小異。

資料遷移

假如我們需要一張學生表,我們不再使用原生SQl語句去建立表。

建立遷移檔案

前提是已經配置好了資料庫連線資訊

php artisan make:migration create_students_table

此命令會在database/migrations/目錄生成類似2017_10_28_035802_create_students_table.php的檔案

我們在裡邊新增students表的資料結構

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // students為表名稱
        Schema::create(`students`, function (Blueprint $table) {
            // 儲存引擎
            $table->engine = `InnoDB`;
            // id自增
            $table->increments(`id`);
            // 學生名稱
            $table->string(`name`);
            // 性別
            $table->string(`sex`);
            // 郵箱
            $table->string(`email`);
            // 喜愛的顏色
            $table->string(`favorite_color`);
            // 手機號
            $table->string(`phone`);
            // 地址
            $table->string(`addr`);
            // 自動維護時間戳
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists(`students`);
    }
}

更多用法,請參考官方手冊。

執行遷移
php artisan migrate

這樣會執行database/migrations/目錄的所有遷移檔案,並自動建立migrations表,來記錄已經執行過的遷移檔案,防止重複執行。
我們看一下資料庫是不是自動建立了students表了呢。

如果出現以下錯誤:

[IlluminateDatabaseQueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t
oo long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t
oo long; max key length is 767 bytes

在database/migrations/目錄裡會有laravel自帶的使用者和重置密碼的兩個遷移檔案,會一併執行。
在這裡我們這樣解決,修改資料庫配置檔案config/database.php裡的mysql下的字符集為utf8即可

`charset`     => `utf8`,
`collation`   => `utf8_unicode_ci`,

想知道為什麼,可猛戳 https://segmentfault.com/a/11…

資料填充(支援中文)

建立學生表Eloquent模型

在app目錄下建立Student.php

<?php
namespace App;

use IlluminateDatabaseEloquentModel;

/**
 * 學生模型
 */
class Student extends Model
{
    
}
建立填充檔案
php artisan make:seed StudentsTableSeeder

這條命令會在database/seeds/目錄下生成StudentsTableSeeder.php填充檔案

<?php

use IlluminateDatabaseSeeder;

class StudentsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 呼叫模型工廠 生成10000條資料
        factory(AppStudent::class, 10000)->create();
    }
}
呼叫該 Seeders

我們開啟database/seeds/DatabaseSeeder.php檔案,修改為

<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 呼叫學生表填充檔案
        $this->call(StudentsTableSeeder::class);
    }
}
建立 模型工廠 填充
php artisan make:factory StudentsFactory -m Student

此命令會在database/factories/目錄下生成StudentsFactory.php檔案,我們定義一下要填充的資料格式

<?php

use FakerGenerator as Faker;

/* @var IlluminateDatabaseEloquentFactory $factory */

$factory->define(AppStudent::class, function (Faker $faker) {
    $sex = rand(1, 1000);
    return [
        `name`           => $faker->name,
        `sex`            => $sex % 2 == 0 ? `男` : `女`,
        `email`          => $faker->unique()->safeEmail,
        `favorite_color` => $faker->safeColorName,
        `phone`          => $faker->phoneNumber,
        `addr`           => $faker->address,
    ];
});

更多配置請查閱 vendor/fzaninotto/faker/src/Faker/Generator.php檔案

讓faker填充中文

在app/Providers/AppServiceProvider.php的boot()中新增:

    public function boot()
    {
        // 填充中文資料
        $this->app->singleton(FakerGenerator::class, function () {
            return FakerFactory::create(`zh_CN`);
        });
    }
開始填充

首先我們執行一下:

composer dump-autoload

自動載入一下我們在database/seeds/目錄建立的填充檔案,以避免出現以下錯誤:

[ReflectionException]
Class StudentsTableSeeder does not exist

接著我們執行填充命令:

php artisan db:seed

由於我們填充的是一萬條資料,可以時間稍長,可以重新整理資料庫看著逐條增加的資料。

大功告成

如果以上操作都沒有報錯的話,來看一下我們的資料庫表students表是否有資料了呢?

id | name | sex | email | favorite_color | phone | addr | created_at |updated_at
—|——|——|——|——|——|——|——|——|——|—
10000 |談英 |男 |cum_et@example.com |白色 |17642207316 |貴陽海陵區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9999 |湯淑珍 |男 |qlaudantium@example.net |黑色 |18239453935 |南寧友好區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9998 |賈春梅 |男 |ea35@example.com |粟色 |17103645128 |長沙蕭山區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9997 |季志明 |男 |cdeleniti@example.com |灰色 |17002359608 |天津花溪區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9996 |成燕 |男 |aspernatur.aut@example.com |黃色 |17181193397 |貴陽錫山區 2017-10-28 05:19:|10 |2017-10-28 05:19:10
9995 |米博 |男 |reprehenderit_autem@example.com |紫 |17187328893 |廣州東麗區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9994 |蘭淑蘭 |女 |et_ea@example.com |綠色 |18592254358 |蘭州經濟開發新區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9993 |樂瑤 |女 |vel.vitae@example.org |藏青 |15891490007 |香港龍潭區 2017-10-28 05:19:|10 |2017-10-28 05:19:10
9992 |葉志新 |女 |lcumque@example.net |藏青 |15564391466 |北京高明區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9991 |胥楊 |男 |voluptatem00@example.com |黃色 |17097722096 |鄭州新城區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9990 |凌敏 |女 |magni22@example.org |鮮綠色 |13021578051 |杭州涪城區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9989 |席建 |女 |fugiat_accusantium@example.net |紫 |18070573726 |南昌海陵區 |2017-10-28 05:19:10 |2017-10-28 05:19:10
9988 |聶新華 |女 |debitis_sapiente@example.com |水色 |17004061646 |成都南長區 |2017-10-28 05:19:10 |2017-10-28 05:19:10

……

原文 https://www.tech1024.cn/origi…

相關文章