Existe-t-il un moyen de tronquer toutes les tables d'une base de données en utilisant éloquent ou courant dans laravel 4? Je ne veux pas spécifier de noms de table, je veux juste tronquer toutes les tables. Dans d'autres les mots vident tous les tableaux.
REMARQUE:
doctrine/dbal
Le package est requis pour effectuer ces opérations
Assurez-vous donc qu'il est installé composer require doctrine/dbal
$tableNames = Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();
foreach ($tableNames as $name) {
//if you don't want to truncate migrations
if ($name == 'migrations') {
continue;
}
DB::table($name)->truncate();
}
Aide: Si vous avez une erreur telle que
SQLSTATE [42000]: erreur de syntaxe ou violation d'accès: 1701 Impossible de tronquer une table référencée dans une contrainte de clé étrangère
Vous pouvez désactiver les contrôles de clé foriegn
Schema::disableForeignKeyConstraints();
et assurez-vous de ReEnable it
Schema::enableForeignKeyConstraints();
Voici ma réponse basée sur @Hao Luo. De plus, il a ces avantages:
Voici le code:
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");
J'espère que vous aimez! :)
Dans laravel 5, migrate: fresh supprimera toutes les tables de la base de données (même si les tables ne sont pas liées à la migration)
Sur la base des réponses précédentes, je filtre les noms de table directement dans la requête SQL. Je suis d'accord, c'est une petite optimisation mais cela évite une boucle inutile.
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');
}
C'est ainsi que je tronque toutes les tables d'une base de données (y compris les exceptions de table), cela fonctionne pour moi.
// 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();
}
Utilisez ceci:
$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();
}
N'oubliez pas que vous importez
utilisez Illuminate\Support\Facades\DB;
PD: Tables_in_YOUR_DATABASE_NAME