使用 Eloquent 截断 laravel 中的所有表

新手上路,请多包涵

有没有一种方法可以在 laravel 4 中使用 eloquent 或 fluent 截断数据库中的所有表?我不想指定表名,我只想截断所有表。换句话说,清空所有表。

原文由 Mounir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 570
2 个回答

注意: doctrine/dbal 执行此操作需要软件包

所以确保已安装 composer require doctrine/dbal

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

帮助:如果你有一些错误,例如

SQLSTATE[42000]:语法错误或访问冲突:1701 无法截断外键约束中引用的表

您可以禁用外键检查

Schema::disableForeignKeyConstraints();

并确保重新 启用

Schema::enableForeignKeyConstraints();

原文由 Hao Luo 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我根据@Hao Luo 的回答。此外,它还有这些优点:

  1. 不需要安装任何额外的包(不需要学说)
  2. 它很好地支持 Laravel 5(或更新版本)
  3. 它禁用外键约束(如果你截断而不关心订单并启用外键约束,你可能会得到一个错误)

这是代码:

 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");

希望你喜欢! :)

原文由 ch271828n 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏