數據填充


編寫Seeders

    #使用模型工廠
  • 呼叫其他Seeders
  • 簡介
  • Laravel 包含一個填充類別可以為你的資料庫填入測試資料。所有的填充類別都放在
database/seeds

目錄下。你可以隨意為填充類別命名, 但更建議您遵守類似 UsersTableSeeder 的命名規範。通常, Laravel 預設定義了一個  

DatabaseSeeder
類別。透過這個類,你可以用
call

方法來運行其它的 seed 類別來控制資料填充的順序。

寫 Seeders

執行 make:seeder 這個 Artisan 指令 來產生 Seeder。框架產生的 seeders 都會被放置在 database/seeds 目錄下

php artisan make:seeder UsersTableSeeder

一個 seeder 類別只包含一個預設方法:run 。這個方法會在執行 db:seed 這個 Artisan 指令 時被呼叫。在  run 方法裡你可以依照需求在資料庫中插入資料。你也可以用 查詢建構器 或 Eloquent 模型工廠 來手動插入資料。

{tip} 批次賦值保護 會在資料填充時自動停用。

如下所示,在預設的DatabaseSeeder 類別中的run 方法中新增一條資料插入語句:

  <?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 的方法簽章中可以用型別來約束你需要的依賴。它們會被 Laravel 服務容器 自動解決。

使用模型工廠

當然,手動為每個模型填充指定屬性很麻煩。作為替代方案,你可以使用 model 工廠 輕鬆地產生大量資料庫資料。首先, 閱讀 model 工廠文件 來學習如何定義工廠文件,一旦定義好了你的工廠文件,然後就可以使用 factory 這個輔助函數來向資料庫插入資料。

例如,建立50 個使用者並為每個使用者建立關聯:

/**
 * 运行数据库填充。
 *
 * @return void
 */
 public function run(){
     factory(App\User::class, 50)->create()->each(function ($u) {
             $u->posts()->save(factory(App\Post::class)->make());   
           });
     }

呼叫其它Seeders

DatabaseSeeder 類別中,你可以使用call 方法來執行其它的seed 類別。使用 call 方法可以將資料填入拆分成多個文件,這樣就不會讓單一 seeder 變得非常大。只要簡單傳遞要執行的seeder 類別名稱:

/**
 * 运行数据库 seeds。
 *
 * @return void
 */
 public function run(){
     $this->call([     
        UsersTableSeeder::class,        
        PostsTableSeeder::class,        
        CommentsTableSeeder::class,    
       ]);
  }

#執行Seeders

完成seeder 類別的寫完之後,你可能需要使用dump-autoload 指令重新產生Composer 的自動載入器:

composer dump-autoload

現在你可以使用Artisan 指令db:seed 來填入資料庫了。預設情況下, db:seed 指令將執行  DatabaseSeeder 類,這個類別可以用來呼叫其它 Seed 類別。不過,你也可以使用--class 選項來指定一個特定的seeder 類別:

php artisan db:seed

php artisan db:seed --class=UsersTableSeeder

你也可以用migrate:refresh 這個指令來填入資料庫,該命令會回滾並重新運行所有遷移。這個指令可以用來重建資料庫:

php artisan migrate:refresh --seed
本篇首發在 LearnKu.com 網站上。