laravel 4?でeloquentまたはfluentを使用して、データベース内のすべてのテーブルを切り捨てることができる方法はありますか?テーブル名を指定したくないので、すべてのテーブルを切り捨てたいだけです。単語はすべてのテーブルを空にします。
注意:
doctrine/dbal
この操作を実行するにはパッケージが必要です
インストールされていることを確認してください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();
}
ヘルプ:次のようなエラーが発生した場合
SQLSTATE [42000]:構文エラーまたはアクセス違反:1701外部キー制約で参照されているテーブルを切り捨てることはできません
あなたはforiegnキーチェックを無効にすることができます
Schema::disableForeignKeyConstraints();
ReEnableであることを確認してください
Schema::enableForeignKeyConstraints();
これが@Hao Luoに基づく私の回答です。さらに、次のような長所があります。
これがコードです:
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");
あなたがそれを好き願っています! :)
laravel 5では、migrate:freshはデータベース内のすべてのテーブルを削除します(テーブルが移行に関連していない場合でも)
以前の回答に基づいて、テーブル名を直接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');
}
これは、データベース内のすべてのテーブル(テーブルの例外を含む)を切り捨てる方法です。
// 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