web-dev-qa-db-ja.com

laravelのすべてのテーブルを雄弁で切り捨てます

laravel 4?でeloquentまたはfluentを使用して、データベース内のすべてのテーブルを切り捨てることができる方法はありますか?テーブル名を指定したくないので、すべてのテーブルを切り捨てたいだけです。単語はすべてのテーブルを空にします。

23
Mounir

注意: doctrine/dbalこの操作を実行するにはパッケージが必要です

インストールされていることを確認してくださいcomposer require doctrine/dbal

1.すべてのテーブル名を取得する

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

2.テーブル名の配列をループし、スキーマビルダーで切り捨てます

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

ヘルプ:次のようなエラーが発生した場合

SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることはできません

あなたはforiegnキーチェックを無効にすることができます

Schema::disableForeignKeyConstraints();

ReEnableであることを確認してください

Schema::enableForeignKeyConstraints();
51
Hao Luo

これが@Hao Luoに基づく私の回答です。さらに、次のような長所があります。

  1. 追加のパッケージをインストールする必要はありません(Doctrineは必要ありません)
  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");

あなたがそれを好き願っています! :)

5
ch271828n

laravel 5では、migrate:freshはデータベース内のすべてのテーブルを削除します(テーブルが移行に関連していない場合でも)

3
Ronald Perez

以前の回答に基づいて、テーブル名を直接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');
}
0
Julien Moulin

これは、データベース内のすべてのテーブル(テーブルの例外を含む)を切り捨てる方法です。

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

これを使って:

$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

0
Kevin Mendez