[Intermediate Laravel] 9-Database-Seeding-and-Model-Factories

來源:互聯網
上載者:User

簡介

一般我們建立好應用時,需要插入一些簡單資料,那我們該如何做,結論是運行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,資料順利插入,如:

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.