Lumen 9 はデータ ファクトリを使用してシミュレーション データをデータベースに生成し、充填速度を最適化します。

データを生成する

まず、データ モデルに特性を導入します。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

のような命名形式でモデル ファクトリを作成します模型名+FactoryAccountFactory次に例を示します。

<?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クラスを分割する

指定したクラスを分割して実行したい場合はSeederIlluminate\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());
    });
}

おすすめ

転載: blog.csdn.net/maxsky/article/details/123996643
おすすめ