數(shù)據(jù)填充
數(shù)據(jù)填充
數(shù)據(jù)庫(kù):填充
簡(jiǎn)介
Laravel 包含一個(gè)填充類可以為你的數(shù)據(jù)庫(kù)填充測(cè)試數(shù)據(jù)。所有的填充類都放在 database/seeds
目錄下。你可以隨意為填充類命名, 但是更建議您遵守類似 UsersTableSeeder
的命名規(guī)范。通常, Laravel 默認(rèn)定義了一個(gè) DatabaseSeeder
類。通過這個(gè)類,你可以用 call
方法來運(yùn)行其它的 seed 類從而控制數(shù)據(jù)填充的順序。
編寫 Seeders
運(yùn)行 make:seeder
這個(gè) Artisan 命令 來生成 Seeder。 由框架生成的 seeders 都將被放置在 database/seeds
目錄下
php artisan make:seeder UsersTableSeeder
一個(gè) seeder 類只包含一個(gè)默認(rèn)方法:run
。 這個(gè)方法會(huì)在執(zhí)行 db:seed
這個(gè) Artisan 命令 時(shí)被調(diào)用。 在 run
方法里你可以根據(jù)需要在數(shù)據(jù)庫(kù)中插入數(shù)據(jù)。你也可以用 查詢構(gòu)造器 或 Eloquent 模型工廠 來手動(dòng)插入數(shù)據(jù)。
{tip} 批量賦值保護(hù) 會(huì)在數(shù)據(jù)填充時(shí)自動(dòng)禁用。
如下所示,在默認(rèn)的 DatabaseSeeder
類中的 run
方法中添加一條數(shù)據(jù)插入語(yǔ)句:
<?php use Illuminate\Support\Str; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; 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'), ]); } }
{tip} 你在
run
的方法簽名中可以用類型來約束你需要的依賴。它們會(huì)被 Laravel 服務(wù)容器 自動(dòng)解決。
使用模型工廠
當(dāng)然,手動(dòng)為每個(gè)模型填充指定屬性很麻煩。作為替代方案,你可以使用 model 工廠 輕松地生成大量數(shù)據(jù)庫(kù)數(shù)據(jù)。 首先, 閱讀 model 工廠文檔 來學(xué)習(xí)如何定義工廠文件,一旦定義好了你的工廠文件,然后就可以使用 factory
這個(gè)輔助函數(shù)來向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)。
例如,創(chuàng)建 50 個(gè)用戶并為每個(gè)用戶創(chuàng)建關(guān)聯(lián):
/** * 運(yùn)行數(shù)據(jù)庫(kù)填充。 * * @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
方法來運(yùn)行其它的 seed 類。使用 call
方法可以將數(shù)據(jù)填充拆分成多個(gè)文件,這樣就不會(huì)使單個(gè) seeder 變得非常大。只需簡(jiǎn)單傳遞要運(yùn)行的 seeder 類名稱即可:
/** * 運(yùn)行數(shù)據(jù)庫(kù) seeds。 * * @return void */ public function run(){ $this->call([ UsersTableSeeder::class, PostsTableSeeder::class, CommentsTableSeeder::class, ]); }
運(yùn)行 Seeders
完成 seeder 類的編寫之后,你可能需要使用 dump-autoload
命令重新生成 Composer 的自動(dòng)加載器:
composer dump-autoload
現(xiàn)在你可以使用 Artisan 命令 db:seed
來填充數(shù)據(jù)庫(kù)了。默認(rèn)情況下, db:seed
命令將運(yùn)行 DatabaseSeeder
類,這個(gè)類可以用來調(diào)用其它 Seed 類。不過,你也可以使用 --class
選項(xiàng)來指定一個(gè)特定的 seeder 類:
php artisan db:seed php artisan db:seed --class=UsersTableSeeder
你也可以用 migrate:refresh
這個(gè)命令來填充數(shù)據(jù)庫(kù),該命令會(huì)回滾并重新運(yùn)行所有遷移。這個(gè)命令可以用來重建數(shù)據(jù)庫(kù):
php artisan migrate:refresh --seed