4

だから私はlaravelアプリケーションを開発しており、シードを最適化してより高速に実行できるようにしようとしています。

http://bensmith.io/speeding-up-laravel-seeders

このガイドは非常に役に立ちました。これによると、大量の挿入を行うことで SQL クエリの数を最小限に抑える必要があり、元のシード時間の 10% まで時間を短縮できます。これは素晴らしいことです。

だから今、私は次のようなことをしています:

$comments = [];
for ($i = 0; $i < 50; $i++) {
    $bar->advance();
    $comments[] = factory(Comment::class)->make([
        'created_at'      => Carbon\Carbon::now(),
        'updated_at'      => Carbon\Carbon::now(),
        'comment_type_id' => $comment_types->shuffle()->first()->id,
        'user_id'         => $users->shuffle()->first()->id,
        'commentable_id'  => $documents->shuffle()->first()->id,
    ])->toArray();
}
Comment::insert($comments);

これは魅力のように機能します。クエリを 1 つにまとめます。

しかし、ダンプを操作する他のシーダーがあり、それらはより複雑です。

$dump = file_get_contents(database_path('seeds/dumps/serverdump.txt'));
DB::table('server')->truncate();
DB::statement($dump);

$taxonomies = DB::table('server')->get();

foreach($taxonomies as $taxonomy){
    $bar->advance();
    $group = PatentClassGroup::create(['name' => $taxonomy->name]);

    preg_match_all('/([a-zA-Z0-9]+)/', $taxonomy->classes, $classes);

    foreach(array_pop($classes) as $key => $class){
        $type = strlen($class) == 4 ? 'GROUP' : 'MAIN';
        $inserted_taxonomies[] = PatentClassTaxonomy::where('name', $class)->get()->count()
            ? PatentClassTaxonomy::where('name', $class)->get()->first()
            : PatentClassTaxonomy::create(['name' => $class, 'type' => $type]);
    }

    foreach($inserted_taxonomies as $inserted_taxonomy){
        try{
            $group->taxonomies()->attach($inserted_taxonomy->id);
        }catch(\Exception $e){
            //
        }
    }
}

ここでタクソノミーをグループに添付するときは、ネイティブの雄弁なコードを使用するため、レコードを取得して大量に挿入することは困難です。はい、いじってそれを大量に挿入する方法を見つけることもできますが、私の問題は、すべてのシードとそれらのシードのすべての部分を作成して最適化し、大量に挿入する必要があることです。

シード中に laravel が実行しようとしている DB クエリをリッスンできる方法はありますか。私はこのようなことができることを知っています:

DB::listen(function($query) {
    //
});

しかし、それでも正しく実行されます。私がやりたいことは、変数でクエリをキャッチし、それをスタックに追加して、シードが終わりに近づいたときにスタック全体を実行することです。または、いくつかのシードにいくつかの ID が必要になる可能性があるため、その中間でもあります。これの良い回避策は何ですか? そして、スマートなソリューションを使用してlaravelのシードを実際に最適化する方法は?

4

0 に答える 0