我使用laravel创建PHPunit测试。对于每个测试,我需要“重置”DB但是丢弃所有表并设置模式非常慢(在mysql上) - 所以我不想更改模式但只删除DATA并重置每个表的AUTO-INCREMENT计数器。
我如何使用播种机做到这一点?
答案 0 :(得分:4)
因为我无法轻易在网上找到解决方案 - 所以在我研究之后我创建了播种机,留给后代留下来;)
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
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(...)
,时间如下:
17.83[s]
php artisan migrate:fresh --seed
{li> 5.56[s]
php artisan db:seed
(使用上面的seder)
正如我们所看到的,播种器从头开始比设置架构快3倍以上 - 这促进了编写自动测试的开发人员:)