使用eloquent截断laravel中的所有表

时间:2013-09-20 04:56:37

标签: php database laravel eloquent fluent

有没有办法可以使用雄辩或流利的laravel 4来截断数据库中的所有表格?我不想指定表名,我只想截断所有表。换句话说,清空所有表格。

7 个答案:

答案 0 :(得分:41)

1。获取所有表名

$tableNames = Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();

2。循环遍历表名数组并使用Schema Builder

进行截断
foreach ($tableNames as $name) {
    //if you don't want to truncate migrations
    if ($name == 'migrations') {
        continue;
    }
    DB::table($name)->truncate();
}

答案 1 :(得分:1)

以下是基于@Hao Luo的答案。此外,它有这些优点:

  1. 您不需要安装任何额外的包(不需要学说)
  2. 很好地支持laravel 5
  3. 它禁用外键约束(如果在不关心订单的情况下截断并启用外键约束,则可能会出现错误)
  4. 以下是代码:

    DB::statement("SET foreign_key_checks=0");
    $databaseName = DB::getDatabaseName();
    $tables = DB::select("SELECT * FROM information_schema.tables WHERE table_schema = '$databaseName'");
    foreach ($tables as $table) {
        $name = $table->TABLE_NAME;
        //if you don't want to truncate migrations
        if ($name == 'migrations') {
            continue;
        }
        DB::table($name)->truncate();
    }
    DB::statement("SET foreign_key_checks=1");
    

    希望你喜欢它! :)

答案 2 :(得分:1)

在laravel 5中,migrate:fresh将删除数据库中的所有表(即使表与迁移无关)

答案 3 :(得分:0)

这是我如何截断数据库中的所有表(包括表异常),它适用于我。

    // set tables don't want to trucate here
    $excepts = ['migrations'];
    $tables = DB::connection()
    ->getPdo()
    ->query("SHOW FULL TABLES")
    ->fetchAll();
    $tableNames = [];

    $keys = array_keys($tables[0]);
    $keyName = $keys[0];
    $keyType = $keys[1];

    foreach ($tableNames as $name) {
        //if you don't want to truncate migrations
        if (in_array($name[$keyName], $excepts))
            continue;

        // truncate tables only
        if('BASE TABLE' !== $name[$keyType])
            continue;

        \DB::table($name)->truncate();
    }

答案 4 :(得分:0)

基于先前的答案,我将表名直接过滤到SQL查询中。我同意这是一个小的优化,但可以避免不必要的循环。

protected function truncateDatabase($excepts = []): void
{
    $excepts = array_merge(['migrations'], $excepts);
    \DB::statement('SET foreign_key_checks=0');
    $table_names = \DB::query()->select('TABLE_NAME')->from('information_schema.tables')
        ->where('TABLE_SCHEMA', \DB::getDatabaseName())
        ->whereNotIn('TABLE_NAME', $excepts)
        ->get()
        ->pluck('TABLE_NAME')
        ->toArray();
    foreach ($table_names as $table_name) {
        \DB::table($table_name)->truncate();
    }
    \DB::statement('SET foreign_key_checks=1');
}

答案 5 :(得分:0)

使用此:

$tables = DB::select('SHOW TABLES');
// it do truncate all tables in database
   foreach($tables as $table){
      if ($table == 'migrations') {
          continue;
      }
      DB::table($table->Tables_in_portal_test)->truncate();
}

记住要导入

  

使用Illuminate \ Support \ Facades \ DB;

PD:Tables_in_YOUR_DATABASE_NAME

答案 6 :(得分:0)

您可以将其添加到您的基本测试用例类中

    protected static function truncateTableAll(array $skip = [])
    {
        Schema::disableForeignKeyConstraints();
        
        foreach (Schema::getConnection()
                     ->getDoctrineSchemaManager()
                     ->listTableNames() as $name) {
            
            if ($name == 'migrations' || in_array($name, $skip)) {
                continue;
            }
            DB::table($name)->truncate();
        }
        
        Schema::enableForeignKeyConstraints();
    }