truncate all tables in laravel using eloquent
In laravel 5, migrate:fresh will drop all the tables in the database (even if tables aren't related to migrate)
Use this:
$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();
}
Remember you import
use Illuminate\Support\Facades\DB;
PD: Tables_in_YOUR_DATABASE_NAME
Here is my answer based on @Hao Luo. Moreover, it has these pros:
- You do not need to install any extra package (no need for doctrine)
- It supports Laravel 5 (or newer) very well
- It disables foreign key constraint (If you truncate without caring about the orders and enables foreign key constraint, you will likely get an error)
Here is the 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");
Hope you like it! :)
NOTE:
doctrine/dbal
Package is Required for Performing this Operations
So Make Sure that is Installed composer require doctrine/dbal
1. Get all the table names
$tableNames = Schema::getConnection()->getDoctrineSchemaManager()->listTableNames();
2. Loop through the array of table names and truncate with Schema Builder
foreach ($tableNames as $name) {
//if you don't want to truncate migrations
if ($name == 'migrations') {
continue;
}
DB::table($name)->truncate();
}
Help: If you have Got Some Error Such as
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint
You Can disable foriegn Key Checks
Schema::disableForeignKeyConstraints();
and make sure to ReEnable it
Schema::enableForeignKeyConstraints();