--- tags: PHP, Laravel, Backend --- # Laravel Seeders ## 簡介 Laravel可以使用seed類別,填充測試用的資料,或者是說這個資料表的資料都是固定的不會更動,也可以使用seed來創建資料 ## 撰寫seeder 首先透過artisan指令來生成seeder檔案,命名規則也應遵守大小寫,類似`UserTableSeeder` 。 `php artisan make:seeder UserTableSeeder` 創建完成後開啟,會看到只有一個預設的方法:run。當執行`db:seed`就會跑run底下的程式碼,在run方法中可以新增你想新增進資料庫的數據,可以使用DB或是 Eloquent ORM對資料進行新增。 laravel 有預先有一個`DatabaseSeeder `的檔案,在`database\seeds`底下,可以在run裡面新增程式碼。 ```php <?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' => 'joe', 'email' => 'joe@gmail.com', 'password' => bcrypt('secret'), ]); } } ``` ### 使用 factory創建假資料 手動為seed要一一指定屬性是很麻煩的,可以使用factory 這個輔助方法函式來新增數據到資料庫中,當一開始資料庫沒有資料,要測試的時候可以這麼做。 舉例創建50個user並與post關聯。 ```php public function run() { factory(App\User::class, 50)->create()->each(function($u) { $u->posts()->save(factory(App\Post::class)->make()); }); } ``` ### 呼叫其他Seeders 在`DatabaseSeeder`類別,可以使用 call 方法執行其他的 seed 類別。 這樣可以避免單一個seeders過於龐大。 只需要傳遞你想要run的seeder類別名稱就好 ```php /** * Run the database seeds. * * @return void */ public function run() { Model::unguard(); $this->call(UsersTableSeeder::class); $this->call(PostsTableSeeder::class); $this->call(CommentsTableSeeder::class); Model::reguard(); } ``` ## 執行seeders 一旦撰寫完成seeder類別,可以使用`db:seed`的artisan指令對資料庫進行填充,`db:seed`將會運行`DatabaseSeeder`類別,透過他來呼叫其他seeders,但也可以使用--class來單獨運行指定的seeder類別: ```php php artisan db:seed php artisan db:seed --class=UserTableSeeder ``` 你也可以使用 migrate:refresh 指令來對資料庫進行資料填充,它會推回所有migration(遷移檔案)並再次執行所有遷移並執行所有seeder。在完全重建你的資料庫時這個指令是非常有用的: `php artisan migrate:refresh --seed`