代码之家  ›  专栏  ›  技术社区  ›  Kamil Kiełczewski

Laravel 5.5:清理/删除数据库数据(非模式!)并使用播种机重置自动增量

  •  2
  • Kamil Kiełczewski  · 技术社区  · 8 年前

    我使用laravel创建PHPunit测试。对于每个测试,我需要“重置”DB,但删除所有表和设置模式的速度非常慢(在mysql上),所以我不想更改模式,只想删除数据并重置每个表的自动递增计数器。

    如何使用播种机进行播种?

    1 回复  |  直到 8 年前
        1
  •  5
  •   Kamil Kiełczewski    8 年前

    因为我无法在网络上轻松找到解决方案——所以在我的研究之后,我创建了seeder,将其留给子孙后代;)

    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;');
            }
        }
    }
    

    后果

    我的DB中有22个表(每个表平均有10列),5个表的播种机数据很少。用于呼叫 Artisan::call(...) 内部测试时间如下:

    • 17.83[s] 对于 php artisan migrate:fresh --seed
    • 5.56[s] 对于 php artisan db:seed (使用上述seder)

    正如我们所看到的,seeder比从头开始设置模式快3倍多,这给编写自动测试的开发人员带来了动力:)

    推荐文章