web-dev-qa-db-fra.com

tronquer toutes les tables dans laravel using eloquent

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.

23
Mounir

REMARQUE: doctrine/dbal Le package est requis pour effectuer ces opérations

Assurez-vous donc qu'il est installé composer require doctrine/dbal

1. Obtenez tous les noms de table

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

2. Parcourez le tableau des noms de table et tronquez-le avec Schema Builder

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();
51
Hao Luo

Voici ma réponse basée sur @Hao Luo. De plus, il a ces avantages:

  1. Vous n'avez pas besoin d'installer de paquet supplémentaire (pas besoin de doctrine)
  2. Il prend en charge laravel 5 très bien
  3. Il désactive la contrainte de clé étrangère (si vous tronquez sans vous soucier des commandes et active la contrainte de clé étrangère, vous obtiendrez probablement une erreur)

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! :)

5
ch271828n

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)

3
Ronald Perez

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

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

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

0
Kevin Mendez