作者:是个success | 来源:互联网 | 2022-12-31 13:55
我使用laravel创建PHPunit测试。对于每个测试,我都需要“重置”数据库,但是删除所有表并设置架构非常慢(在mysql上)-因此,我不想更改架构,而只删除DATA并重置每个表的AUTO-INCREMENT计数器。
我如何使用播种机做到这一点?
1> Kamil Kiełcz..:
因为我无法轻松地在网上找到解决方案,所以研究完成后,我创建了播种机,留给子孙后代;)
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
5.56[s]
用于php artisan db:seed
(使用以上seder)
如我们所见,seeder比从头开始的设置模式快3倍以上-这有助于编写自动测试的开发人员:)