簡介
一般我們建立好應用時,需要插入一些簡單資料,那我們該如何做,結論是運行Database-Seeding功能。
Database-Seeding 資料填充
預設 database\seeds\ 下只有單一的 DatabaseSeeder.php,我們建立 UsersTableSeeder.php 類:
class UsersTableSeeder extends Seeder{ /** * Run the database seeds. * * @return void */ public function run() { //不用factory,也可以使用App\User::create()或者DB::table()等 factory('App\User',50)->create(); }}
修改 DatabaseSeeder.php :
class DatabaseSeeder extends Seeder{ /** * Run the database seeds. * * @return void */ public function run() { Model::unguard(); //調用UsersTableSeeder $this->call('UsersTableSeeder'); }}
執行 db:seed 命令: php artisan db:seed 隨後我們可以查詢資料是否插入:
- 在 Unix 系統中,使用如下命令列: sqlite3 storage/database.sqlite select * from users;
- 在 Windows 系統中可下載 Database4 免費版軟體,開啟 storage/database.sqlite 目錄檔案進行查看:
看到這裡,你肯定會問這些人名,郵箱名是如何自動產生的,下面我們接著看。
資料規則
database\factories 目錄下 ModelFactory.php 定義了 User 表中插入資料的規則定義:
$factory->define(App\User::class, function (Faker\Generator $faker) { return [ 'name' => $faker->name, 'email' => $faker->email, 'password' => bcrypt(str_random(10)), 'remember_token' => str_random(10), ];});
UsersTableSeeder 中可以重寫規則:
class UsersTableSeeder extends Seeder{ /** * Run the database seeds. * * @return void */ public function run() { //可以重寫Model Factories中規則,統一插入 John Doe 的 name factory('App\User',50)->create([ 'name' => 'John Doe' ]); }}
結果如:
我們可以在插入資料之前,刪除無效資料:
class DatabaseSeeder extends Seeder{ protected $toTruncate = ['users']; /** * Run the database seeds. * * @return void */ public function run() { Model::unguard(); // 迴圈刪除表 foreach($this->toTruncateas $table) { DB::table($table)->truncate(); } $this->call('UsersTableSeeder'); }}
建立 LessonSeeder
這次我們同時建立 Model 和 Factories,運行命令列:
php artisan make:model Lesson --migration
補全 CreateLessonsTable 中屬性欄位:
class CreateLessonsTable extends Migration{ /** * Run the migrations. * * @return void */ public function up() { Schema::create('lessons', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamp('published_at'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('lessons'); }}
執行命令列: php artisan migrate ,建立 lessons 表結構。
補全 DatabaseSeeder 中調用 LessonsTableSeeder
class DatabaseSeeder extends Seeder{ protected $toTruncate = ['users']; /** * Run the database seeds. * * @return void */ public function run() { Model::unguard(); // 迴圈刪除表 foreach($this->toTruncateas $table) { DB::table($table)->truncate(); } $this->call('UsersTableSeeder'); $this->call('LessonsTableSeeder'); }}
執行命令列 php artisan db:seed 會出現如異常:
原因是:composer.json 中預設只載入了 database
解決方案有兩種:
1. 運行命令列: composer dump-autoload
2. 利用命令列建立Seeder: php artisan make:seeder LessonsTableSeeder
插入資料
在 ModelFactory.php 中新增 Lesson 插入資料規則:
$factory->define(App\Lesson::class, function (Faker\Generator $faker) { return [ 'title' => $faker->sentence, 'body' => $faker->paragraph, 'published_at' => $faker->dateTime() ];});
再執行命令列: php artisan db:seed ,OK,資料順利插入,如: