データを生成する
まず、データ モデルに特性を導入します。Illuminate\Database\Eloquent\Factories\HasFactory;
例:
<?php
namespace App\Models\Entities\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Account extends Model {
use HasFactory;
protected $table = 'table_name';
}
database/factories
データを生成する必要があるモデルの作成パスに従って、ディレクトリに戻りますnamespace
(上記App\Models\Entities\User
)。
# 取 Models 后面部分即可,创建相同路径
database/factories/Entities/User
のような命名形式でモデル ファクトリを作成します模型名+Factory
。AccountFactory
次に例を示します。
<?php
namespace Database\Factories\Entities\User;
use App\Models\Entities\User\Account;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class AccountFactory extends Factory {
protected $model = Account::class;
/**
* @return array
*/
public function definition(): array {
return [
'data_id' => mt_rand(1, 999),
'data_str' => Str::random(),
'md5' => $this->faker->md5(),
'update_date' => $this->faker->dateTimeBetween('-1 months')
// 其它需要 faker 填充的部分参考文档
];
}
}
最後にdatabase/seeders/DatabaseSeeder.php
ファイルを編集します。
<?php
namespace Database\Seeders;
use App\Models\Entities\User\Account;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder {
use WithoutModelEvents;
/**
* Run the database seeds.
*
* @return void
*/
public function run(): void {
// 避开正式环境
if (env('APP_ENV') !== 'production') {
// 指定生成数量,此处亦可使用 create 方法
Account::factory(1000)->createQuietly();
}
}
}
準備作業が完了したら実行すると、プロジェクトのルート ディレクトリでコマンド ウィンドウが開きます。
php artisan db:seed
データはデータベースに入力されます
Seederクラスを分割する
指定したクラスを分割して実行したい場合はSeeder
、Illuminate\Database\Seeder
継承するクラスを追加するだけです。
次に、のメソッドをDatabaseSeeder
次のように変更します。run
$this->call(TargetClassSeeder::class);
この時点でコマンド ウィンドウで以下を使用できます。
# 默认 --class 为 DatabaseSeeder
php artisan db:seed --class=TargetClassSeeder
# 指定数据库连接
php artisan db:seed --database=another_connection
# 在生产环境中强制生成模拟数据
php artisan db:seed --force
処理速度の最適化
生成される数が10,000facotry
レベルを超えないようにすることをお勧めします。そうでない場合は、PHP 設定のメモリ制限を増やす必要があります。
ここでは、10,000 個のデータを 10 個のブロックに分割し、各ブロックを取り出して 1000 個に変換しarray
、最終的にinsert
メソッドで高速に挿入します。
デフォルトでは、ファクトリは単一のエントリにデータを挿入しますが、これはあまりにも非効率的です。
if (env('APP_ENV') !== 'production') {
$data = Account::factory(10000)->make();
$chunks = $data->chunk(1000);
$chunks->each(function ($chunks) {
Account::insert($chunks->toArray());
});
}