Covers Laravel 13 database migrations: the Schema Builder API for
creating/modifying/dropping tables, the 50+ column types and modifiers,
index types (primary, unique, fulltext, spatial), foreign key constraints
with cascade options, Artisan migration commands, seeders, testing
migrations, safe production rollout, troubleshooting, and enabling pgvector
via Schema::ensureVectorExtensionExists() for vector columns (see
laravel-vector-search for querying them).
Laravel Migrations
Agent Workflow (MANDATORY)
Before ANY implementation, spawn 3 agents in parallel, one Agent call each with a name:
- fuse-ai-pilot:explore-codebase - Check existing migrations
- fuse-ai-pilot:research-expert - Verify Laravel 13 patterns via Context7
- mcp__context7__query-docs - Check specific Schema Builder features
After implementation, run fuse-ai-pilot:sniper for validation.
Overview
| Feature |
Description |
| Schema Builder |
Create, modify, drop tables |
| Columns |
50+ column types with modifiers |
| Indexes |
Primary, unique, fulltext, spatial |
| Foreign Keys |
Constraints with cascade options |
| Seeders |
Populate tables with data |
Critical Rules
- Always define down() - Reversible migrations
- Use foreignId()->constrained() - Not raw unsignedBigInteger
- Add indexes on foreign keys - Performance critical
- Test rollback before deploy - Validate down() works
- Never modify deployed migrations - Create new ones
Decision Guide
Migration Type
Need schema change?
├── New table → make:migration create_X_table
├── Add column → make:migration add_X_to_Y_table
├── Modify column → make:migration modify_X_in_Y_table
├── Add index → make:migration add_index_to_Y_table
└── Seed data → make:seeder XSeeder
Column Type Selection
| Use Case |
Type |
Example |
| Primary Key |
id() |
Auto-increment BIGINT |
| Foreign Key |
foreignId()->constrained() |
References parent |
| UUID Primary |
uuid()->primary() |
UUIDs |
| Boolean |
boolean() |
is_active |
| Enum |
enum('status', [...]) |
order_status |
| JSON |
json() |
preferences |
| Money |
decimal('price', 10, 2) |
99999999.99 |
| Timestamps |
timestamps() |
created_at, updated_at |
| Soft Delete |
softDeletes() |
deleted_at |
Foreign Key Cascade
| Scenario |
onDelete |
Use Case |
| Strict integrity |
restrictOnDelete() |
Financial records |
| Auto-cleanup |
cascadeOnDelete() |
Post → Comments |
| Preserve with null |
nullOnDelete() |
Optional relations |
| No action |
noActionOnDelete() |
Audit logs |
Reference Guide
Core Concepts
Advanced Topics
Templates
Quick Reference
Create Table
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title');
$table->text('content');
$table->enum('status', ['draft', 'published'])->default('draft');
$table->timestamps();
$table->softDeletes();
$table->index(['user_id', 'status']);
});
Modify Table
Schema::table('posts', function (Blueprint $table) {
$table->string('slug')->after('title')->unique();
$table->boolean('featured')->default(false);
});
Commands
php artisan make:migration create_posts_table
php artisan migrate
php artisan migrate:rollback --step=1
php artisan migrate:fresh --seed
Best Practices
DO
- Use
foreignId()->constrained() for foreign keys
- Add composite indexes for common queries
- Test down() method before deploying
- Use
--pretend to preview SQL
DON'T
- Modify already-deployed migrations
- Forget down() method
- Use raw SQL without Schema Builder
- Skip indexes on foreign keys
Laravel 13 Notes
Schema::ensureVectorExtensionExists() (pgvector)
Laravel 13 expose une helper pour activer l'extension pgvector sur PostgreSQL depuis une migration. Utile pour embeddings et recherche sémantique.
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::ensureVectorExtensionExists();
Schema::create('documents', function (Blueprint $table) {
$table->id();
$table->text('content');
$table->vector('embedding', dimensions: 1536); // OpenAI ada-002
$table->timestamps();
$table->index('embedding', 'documents_embedding_idx', 'hnsw');
});
}
};
Voir [[laravel-vector-search]] pour les requêtes whereVectorSimilarTo().