我使用 laravel 创建 PHPunit tests。对于每个测试,我需要"重置"数据库,但删除所有表并设置模式非常慢(在 mysql 上( - 所以我不想更改模式,而只想删除每个表的数据并重置自动增量计数器。
如何使用播种机做到这一点?
因为我无法在网上轻松找到解决方案 - 所以在我的研究之后,我创建了播种机,把它留在这里留给后代;)
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseSeeder;
use IlluminateSupportFacadesDB;
class CleanTablesSeeder extends Seeder
{
public function run()
{
$rows = DB::select('SHOW TABLES');
$tables = array_column($rows, 'Tables_in_'.env('DB_DATABASE'));
$this->clean($tables);
}
private function clean($tables)
{
Model::unguard();
foreach ($tables as $table) {
DB::table($table)->delete();
DB::statement('ALTER TABLE '.$table.' AUTO_INCREMENT = 0;');
}
}
}
结果
我的数据库中有 22 个表(平均每个表 10 列(,5 个表只有很少的播种机数据。对于在测试中调用Artisan::call(...)
,计时如下:
-
php artisan migrate:fresh --seed
17.83[s]
-
5.56[s]
php artisan db:seed
(使用上述 seder(
如我们所见,播种机比从头开始设置架构快 3 倍以上 - 这为编写自动测试的开发人员提供了动力:)