だから私は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のシードを実際に最適化する方法は?