數(shù)據(jù)庫:數(shù)據(jù)填充(Seeding)
簡(jiǎn)介
Laravel 使用 seed 類提供一種簡(jiǎn)便的方法填充你用于測(cè)試的數(shù)據(jù)。所有的 seed 類文件都被存儲(chǔ)在 database/seeds
目錄下绢涡。Seed 類可以擁有任意的類名山害,但是你應(yīng)該遵循某些命名規(guī)范,比如 UsersTableSeeder
牌捷,等等丛肮。默認(rèn)的 Laravel 為你提供了 DatabaseSeeder
類赡磅,在這個(gè)類中,你可以使用 call
方法來調(diào)用其他的 seed 類宝与,這為你順序的進(jìn)行數(shù)據(jù)填充提供了便利焚廊。
編寫 Seeders
你可以使用 make:seeder
Artisan 命令來生成一個(gè) seeder冶匹。所有通過框架生成的 seeders 都會(huì)被放在 database/seeds
目錄下:
php artisan make:seeder UsersTableSeeder
seeder 類中默認(rèn)的只包含了一個(gè)方法:run
。該方法會(huì)在 db:seed
Artisan 命令執(zhí)行時(shí)被調(diào)用咆瘟。在 run
方法中嚼隘,你可以填充任意你想填充的數(shù)據(jù)到數(shù)據(jù)庫中,你可以使用查詢生成器手動(dòng)的插入數(shù)據(jù)袒餐,或者你也可以使用 Eloquent 模型工廠飞蛹。
讓我們來做個(gè)示例,我們修改 Laravel 默認(rèn)提供的 DatabaseSeeder
類灸眼,讓我們?cè)?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)然卧檐,手動(dòng)的為每個(gè)模型 seed 指定屬性是一件非常麻煩的事情。你可以使用 model factories 來方便的生成大量的數(shù)據(jù)記錄焰宣。首先霉囚,你需要查詢一下 model factory documentation 來學(xué)習(xí)一下如何定義你的模型工廠。一旦你定義了模型工廠匕积,你就可以使用 factory
幫助方法來插入數(shù)據(jù)到庫中盈罐。
比如,讓我們創(chuàng)建 50 個(gè)用戶并且為每個(gè)用戶附加一個(gè)關(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ù)庫填充分解到多個(gè)文件中,這樣不會(huì)使一個(gè)單獨(dú)的 seed 文件過于龐大悄蕾。你只需要簡(jiǎn)單的傳遞 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
命令會(huì)直接執(zhí)行 DatabaseSeeder
類库物,你也可以在這個(gè)類中調(diào)用其他的 seed 類。事實(shí)上贷帮,你也可以使用 --class
選項(xiàng)來指定需要填充的類:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
你也可以在使用 migrate:refresh
命令時(shí)運(yùn)行 seed戚揭,這將回滾所有的遷移,然后再執(zhí)行遷移撵枢,之后進(jìn)行填充數(shù)據(jù)民晒。這條命令對(duì)于應(yīng)用的數(shù)據(jù)庫重置非常有用:
php artisan migrate:refresh --seed