數(shù)據(jù)庫:數(shù)據(jù)填充(Seeding)
簡介
Laravel 使用 seed 類提供一種簡便的方法填充你用于測試的數(shù)據(jù)。所有的 seed 類文件都被存儲在 database/seeds
目錄下。Seed 類可以擁有任意的類名,但是你應(yīng)該遵循某些命名規(guī)范,比如 UsersTableSeeder
,等等。默認(rèn)的 Laravel 為你提供了 DatabaseSeeder
類,在這個類中,你可以使用 call
方法來調(diào)用其他的 seed 類,這為你順序的進(jìn)行數(shù)據(jù)填充提供了便利。
編寫 Seeders
你可以使用 make:seeder
Artisan 命令來生成一個 seeder。所有通過框架生成的 seeders 都會被放在 database/seeds
目錄下:
php artisan make:seeder UsersTableSeeder
seeder 類中默認(rèn)的只包含了一個方法:run
。該方法會在 db:seed
Artisan 命令執(zhí)行時被調(diào)用。在 run
方法中,你可以填充任意你想填充的數(shù)據(jù)到數(shù)據(jù)庫中,你可以使用查詢生成器手動的插入數(shù)據(jù),或者你也可以使用 Eloquent 模型工廠。
讓我們來做個示例,我們修改 Laravel 默認(rèn)提供的 DatabaseSeeder
類,讓我們在 run
方法中進(jìn)行一些數(shù)據(jù)插入:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
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'),
]);
}
}
使用模型工廠
當(dāng)然,手動的為每個模型 seed 指定屬性是一件非常麻煩的事情。你可以使用 model factories 來方便的生成大量的數(shù)據(jù)記錄。首先,你需要查詢一下 model factory documentation 來學(xué)習(xí)一下如何定義你的模型工廠。一旦你定義了模型工廠,你就可以使用 factory
幫助方法來插入數(shù)據(jù)到庫中。
比如,讓我們創(chuàng)建 50 個用戶并且為每個用戶附加一個關(guān)系:
/**
* 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());
});
}
調(diào)用其他 Seeders
在 DatabaseSeeder
類中,你可以使用 call
方法來執(zhí)行其他的 seed 類。使用 call
方法允許你將數(shù)據(jù)庫填充分解到多個文件中,這樣不會使一個單獨(dú)的 seed 文件過于龐大。你只需要簡單的傳遞 seeder 的類名到方法中就可以進(jìn)行調(diào)用:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(PostsTableSeeder::class);
$this->call(CommentsTableSeeder::class);
}
執(zhí)行 Seeders
一旦你編寫完成 seeder 類,你就可以使用 db:seed
Artisan 命令來將數(shù)據(jù)填充到數(shù)據(jù)庫中。默認(rèn)的,db:seed
命令會直接執(zhí)行 DatabaseSeeder
類,你也可以在這個類中調(diào)用其他的 seed 類。事實上,你也可以使用 --class
選項來指定需要填充的類:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
你也可以在使用 migrate:refresh
命令時運(yùn)行 seed,這將回滾所有的遷移,然后再執(zhí)行遷移,之后進(jìn)行填充數(shù)據(jù)。這條命令對于應(yīng)用的數(shù)據(jù)庫重置非常有用:
php artisan migrate:refresh --seed