Use DB::statement() in database migrations to execute raw SQL statements for database triggers, stored procedures, and full-text indexes.
While Laravel's Schema Blueprint supports standard database types, advanced database-specific features (such as PostgreSQL full-text search dictionaries, MySQL generated columns, or custom triggers) require executing raw SQL.
DB::statement() executes raw SQL DDL statements directly against the active database connection.
Executing Raw SQL in Migrations
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
public function up(): void
{
// Add a PostgreSQL GIN index for fast full-text searching
DB::statement('CREATE INDEX posts_search_vector_idx ON posts USING gin(to_tsvector(\'english\', title || \' \' || body));');
}
public function down(): void
{
DB::statement('DROP INDEX IF EXISTS posts_search_vector_idx;');
}
};
Parameter Binding with DB::statement()
For parameterized DDL or maintenance operations:
DB::statement('ALTER TABLE users AUTO_INCREMENT = :val', ['val' => 1000]);
Summary
- Executes raw database DDL commands that Blueprint methods do not support.
- Supports parameter binding to prevent SQL injection.
- Returns a boolean indicating execution success.
Related Tips
View all tips →Use Database Expressions for Dynamic Migration Defaults
Pass an Expression instance to Laravel's migration default() method to define raw SQL functions, dynamic timestamps, and calculated defaults directly in your database schema.
Index Dynamic JSON Attributes with Generated Virtual Columns
Use virtualAs() and storedAs() in migrations to create generated database columns for high-speed indexing on JSON attributes.