Laravel 5.5: chow to clean/drop db data (not schema!) 并使用 seeder 重置自动增量

Laravel 5.5: chow to clean/drop db data (not schema!) and reset auto-increment using seeder

我使用 laravel 创建 PHPunit 测试。对于每个测试,我都需要 "reset" 数据库,但是删除所有 table 并设置模式非常慢(在 mysql 上)——所以我不想更改模式,而只删除数据和为每个 table.

重置 AUTO-INCREMENT 计数器

我如何使用播种机做到这一点?

因为我无法在网上轻松找到解决方案 - 所以在我研究之后,我创建了播种机,留在这里供后代使用;)

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 tables(每个 table 平均 10 列),5 tables 的播种机数据很少。对于在测试中调用 Artisan::call(...),时间如下:

  • 17.83[s] 对于 php artisan migrate:fresh --seed
  • 5.56[s] for php artisan db:seed(使用上面的家宴)

正如我们所见,播种器比从头开始设置模式快 3 倍多 - 这为编写自动测试的开发人员提供了动力:)