寫在前面
經常我們做專案都團隊協作開發,每個人都在自己本地的資料庫,如果你曾經出現過讓同事手動在資料庫結構中新增欄位的情況,資料庫遷移可以解決你這個問題。
不僅如此,線上上部署的時候,也避免了手動匯入資料庫或手動修改資料結構的麻煩,資料遷移幫你方便的維護著資料結構。
資料填充,讓我們測試的時候需要大量的假資料不再一條一條的去造資料,可以輕鬆的批量填充大量資料。
本文基於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
……