如何在 Laravel 中使用 Database Seeders 輕鬆產生數據

WBOY
發布: 2024-07-26 04:48:43
原創
388 人瀏覽過

How to easily generate data with Database Seeders in Laravel

建置應用程式時,無論是小型、中型或大型。在應用程式中使用測試數據是不可避免且重要的。

因此,讓我們從簡單到高級,從兩個不同的場景開始。

我。所有應用程式或大多數應用程式都應該有用戶。有時,我們希望將使用者分類/標記為管理員或常規使用者。因此,讓我們產生一個包含 100 個使用者的簡單播種器,其表規格如下:

  • ID、名字、姓氏、電子郵件、密碼
  • 使用者類型:管理員或常規使用者

我們開始吧。

為了植入 users 表,當然,您需要 Laravel 為您建立預設的使用者遷移表。

因此,為了演示,您的表格遷移應如下所示:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email');
            $table->string('password');
            $table->enum('user_type', ['user','admin'])->default('user');
            $table->rememberToken();
            $table->timestamps();
        });
    }
登入後複製

為我們的使用者表建立一個播種器類別。

php artisan make:seeder UserSeeder
登入後複製

因此,要為我們剛剛建立的播種器建立值,我們需要使用每個 Laravel 應用程式附帶的預設 Faker 套件。

為了一次產生 100 個用戶,我們先執行一個 for 迴圈並將假/偽資料傳遞到每一列,如下所示:

use Faker\Factory as Faker;

public function run()
{
   $faker = Faker::create();

   for(i = 0; i <= 99; i++)
   {
      User::create([
        'first_name' => $faker->firstName(),
        'last_name' => $faker->lastName(),
        'email' => $faker->email(),
        'password' => bcrypt('hello1234'), // we might want to set this to a value we can easily remember for testing sake
        'user_type' => $faker->randomElement(['admin', 'user'])
      ]);
   }
}
登入後複製

要將其播種到資料庫中,我們需要執行以下命令:

php artisan db:seed --class=UserSeeder
登入後複製

這將建立 100 個使用者並將其插入資料庫。

就這麼簡單

現在,我們需要一個更進階的解決方案。

我們需要建立:

  • 包含 10 個新部門的部門表。
  • 我們將建立 100 個新使用者。
  • 員工表將引用用戶表,具有相同的詳細資訊和一個額外的列來引用部門表,即department_id。

我們已經知道使用者表是什麼樣子,讓我們看看員工表和部門表是什麼樣子。

員工桌

Schema::create('staff', function (Blueprint $table) {
            $table->id();
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email');
            $table->foreignId('department_id')->references('id')->on('departments');
            $table->foreignId('user_id')->references('id')->on('users');
            $table->timestamps();
        });
登入後複製

部門表:

Schema::create('departments', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
登入後複製

因此我們需要執行遷移才能將這些表保留在我們的資料庫中。

現在,對於 UserSeeder 類,我們將實作前面所述的要點。

  • 包含 10 個新部門的部門表。
$now = now();
        $count = 0;
        $departmentNames = ['Electronics', 'Home & Garden', 'Toys & Games', 'Health & Beauty', 'Automotive', 'Sports & Outdoors','Clothing & Accessories',
            'Books', 'Music', 'Movies & TV', 'Grocery'
        ];

        for ($j=0; $j <= 9; $j++){
            Department::create([
                'name' => $departmentNames[$j],
                'created_at' => $now,
                'updated_at' => $now,
            ]);
            $count++;
        }
登入後複製

最後兩個要點需要一起實現

  • 我們將建立新的 100 個使用者
  • 員工表將引用用戶表,具有相同的詳細資訊和一個額外的列來引用部門表,即department_id。
if ($count == 10) { // we need to make sure we have all 10 departments
            $departments = Department::pluck('id')->toArray();

            for ($i=0; $i <= 99; $i++) {
                $user = User::create([
                    'first_name' => $faker->firstName(),
                    'last_name' => $faker->lastName(),
                    'email' => $faker->email(),
                    'password' => bcrypt('hello1234'),
                    'user_type' => $faker->randomElement(['admin', 'user']),
                    'created_at' => $now,
                    'updated_at' => $now
                ]);

                Staff::create([
                    'first_name' => $user->first_name,
                    'last_name' => $user->last_name,
                    'email' => $user->email,
                    'user_id' => $user->id,
                    'department_id' => $faker->randomElement($departments), // pick random departments from DB
                    'created_at' => $now,
                    'updated_at' => $now
                ]);
            }
}
登入後複製

說明:

  • 我們先創建了10個部門。

  • 然後我們設定了一個計數器來檢查是否所有 10 個部門都已建立。

  • 如果計數器條件為真,我們將建立 100 個使用者。

  • 對於這 100 個使用者中的每一個,我們需要在另一個名為員​​工表的表中引用他們的詳細資料。

  • 每個員工必須屬於一個用戶,也必須屬於一個部門,所以為此,我們需要取得先前建立的所有部門,並將它們隨機注入到department_id列中。

完整的 UserSeeder 實作

        $now = now();
        $count = 0;
        $departmentNames = ['Electronics', 'Home & Garden', 'Toys & Games', 'Health & Beauty', 'Automotive', 'Sports & Outdoors','Clothing & Accessories',
            'Books', 'Music', 'Movies & TV', 'Grocery'
        ];

        for ($j=0; $j <= 9; $j++){
            Department::create([
                'name' => $departmentNames[$j],
                'created_at' => $now,
                'updated_at' => $now,
            ]);
            $count++;
        }

        $faker = Faker::create();
        if ($count == 10) {
            $departments = Department::pluck('id')->toArray();

            for ($i=0; $i <= 99; $i++) {
                $user = User::create([
                    'first_name' => $faker->firstName(),
                    'last_name' => $faker->lastName(),
                    'email' => $faker->email(),
                    'password' => bcrypt('hello1234'),
                    'user_type' => $faker->randomElement(['admin', 'user']),
                    'created_at' => $now,
                    'updated_at' => $now
                ]);

                Staff::create([
                    'first_name' => $user->first_name,
                    'last_name' => $user->last_name,
                    'email' => $user->email,
                    'user_id' => $user->id,
                    'department_id' => $faker->randomElement($departments), // pick random departments from DB
                    'created_at' => $now,
                    'updated_at' => $now
                ]);
            }
        }
登入後複製

然後運行:

php artisan make:seeder --class=UserSeeder
登入後複製

如果您有任何疑問,請隨時提出。快樂編碼!

以上是如何在 Laravel 中使用 Database Seeders 輕鬆產生數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板