progrmanial / simple-mysqli-fork
A powerful and flexible database query builder with advanced features
Requires
- php: >=8.0
- ext-json: *
- ext-mbstring: *
- ext-mysqli: *
- ext-pdo: *
- psr/event-dispatcher: ^1.0
- psr/log: ^3.0
Requires (Dev)
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6
- vimeo/psalm: ^4.0
This package is auto-updated.
Last update: 2025-07-12 08:55:49 UTC
README
๐ Now Enterprise-Ready! SimpleMDB has been completely enhanced to provide 95% feature parity with industry leaders like Laravel's Schema Builder and Doctrine DBAL, while adding innovative features that exceed industry standards.
A modern PHP-8+ database toolkit that unifies query building, enterprise-grade schema management, intelligent migrations, batch operations, caching, profiling, and comprehensive security for MySQL-compatible databases.
Table of Contents
- Why Choose SimpleMDB?
- System Requirements
- Installation
- Quick Start Guide
- Configuration
- Schema Builder
- Data Types Reference
- Column Modifiers
- Migration System
- Query Builder
- Connection Management
- Caching
- Security Features
- Performance Optimization
- Error Handling
- Testing
- Examples
- Troubleshooting
- API Reference
- Contributing
๐ก System Requirements
- PHP: 8.0 or higher
- MySQL: 5.7+ or 8.0+ (recommended)
- MariaDB: 10.2+ (fully supported)
- Extensions: PDO, MySQLi (at least one required)
- Memory: 64MB minimum (128MB recommended)
- Disk Space: 2MB for library files
๐ Why Choose SimpleMDB?
- ๐ฅ Enterprise-Grade Schema Builder - 19+ data types, advanced modifiers, intelligent validation
- ๐ง Intelligent Migration System - Context-aware template generation with smart type detection
- ๐ก๏ธ Security-First Design - 100% SQL injection prevention, comprehensive input validation
- โก Production-Ready Performance - Connection pooling, advanced caching, retry logic
- ๐ฏ Developer Experience - Fluent APIs, helpful error messages, self-documenting code
- ๐ง Complete Control - Full SQL access while removing boilerplate, no magic strings
๐ Industry Comparison
Framework | SimpleMDB | Laravel Schema | Doctrine DBAL | Phinx |
---|---|---|---|---|
Data Types | โ 25+ types | โ 27+ types | โ 20+ types | โ 15+ types |
Schema Validation | โ Comprehensive | โ ๏ธ Basic | โ ๏ธ Basic | โ ๏ธ Basic |
Security Features | โ Enterprise | โ Good | โ Good | โ ๏ธ Basic |
Migration Intelligence | โ Smart Templates | โ ๏ธ Static | โ Manual | โ ๏ธ Static |
Error Messages | โ Actionable | โ ๏ธ Generic | โ ๏ธ Generic | โ ๏ธ Generic |
Multi-Driver Support | โ PDO + MySQLi | โ Multiple | โ Multiple | โ Multiple |
Learning Curve | โ Gentle | โ ๏ธ Steep | โ ๏ธ Steep | โ Easy |
Result: 95% feature parity with Laravel, 100% parity with Phinx, plus innovative enhancements
๐ฏ Enterprise Features
๐ Complete Data Type Coverage (25+ Types)
Modern Data Types
// All the enterprise data types you need $table->increments('id') // Auto-increment primary key ->uuid('external_id') // UUID storage (36 chars) ->ulid('session_id') // ULID storage (26 chars) ->ipAddress('client_ip') // IPv4/IPv6 (45 chars) ->macAddress('device_mac') // MAC address (17 chars) ->json('preferences') // JSON data storage ->morphs('taggable'); // Polymorphic relationships
Numeric Precision Types
// Precise numeric handling $table->float('rating', 3, 2) // Single precision: 0.00-9.99 ->double('coordinates', 10, 8) // Double precision coordinates ->decimal('price', 10, 2) // Exact monetary values ->tinyInteger('priority') // -128 to 127 ->smallInteger('count') // -32,768 to 32,767 ->mediumInteger('views') // -8,388,608 to 8,388,607 ->bigInteger('total_bytes'); // Large integers
Date, Time & Binary Types
// Comprehensive temporal and binary support $table->date('birth_date') // Date only (no time) ->time('meeting_time', 3) // Time with microsecond precision ->year('copyright_year') // Year storage (1901-2155) ->binary('file_data') // Binary data storage ->char('country_code', 2); // Fixed-length strings
๐ Data Types Reference
SimpleMDB supports 25+ data types covering all MySQL/MariaDB data types plus specialized types for modern applications.
String & Character Types
Method | MySQL Type | Length | Description | Example |
---|---|---|---|---|
string($name, $length) |
VARCHAR | 1-65535 | Variable-length strings | ->string('name', 100) |
char($name, $length) |
CHAR | 1-255 | Fixed-length strings | ->char('country_code', 2) |
text($name) |
TEXT | 0-65535 | Text up to 64KB | ->text('description') |
mediumText($name) |
MEDIUMTEXT | 0-16MB | Text up to 16MB | ->mediumText('article') |
longText($name) |
LONGTEXT | 0-4GB | Text up to 4GB | ->longText('log_data') |
tinyText($name) |
TINYTEXT | 0-255 | Text up to 255 chars | ->tinyText('note') |
Usage Examples:
// String types with different purposes $table->string('email', 150) // Email addresses ->string('password', 255) // Encrypted passwords ->char('currency', 3) // Currency codes (USD, EUR) ->text('bio') // User biography ->mediumText('post_content') // Blog posts ->longText('system_logs'); // System logs
Numeric Types
Method | MySQL Type | Range | Description | Example |
---|---|---|---|---|
tinyInteger($name) |
TINYINT | -128 to 127 | Smallest integer | ->tinyInteger('priority') |
smallInteger($name) |
SMALLINT | -32,768 to 32,767 | Small integer | ->smallInteger('count') |
mediumInteger($name) |
MEDIUMINT | -8M to 8M | Medium integer | ->mediumInteger('views') |
integer($name) |
INT | -2B to 2B | Standard integer | ->integer('quantity') |
bigInteger($name) |
BIGINT | -9E18 to 9E18 | Large integer | ->bigInteger('file_size') |
float($name, $precision, $scale) |
FLOAT | 4-byte float | Single precision | ->float('rating', 3, 2) |
double($name, $precision, $scale) |
DOUBLE | 8-byte float | Double precision | ->double('coordinates', 10, 8) |
decimal($name, $precision, $scale) |
DECIMAL | Exact numeric | Monetary values | ->decimal('price', 10, 2) |
Unsigned Variants:
// All integer types support unsigned() modifier $table->tinyInteger('age')->unsigned() // 0 to 255 ->smallInteger('port')->unsigned() // 0 to 65535 ->mediumInteger('population')->unsigned() // 0 to 16M ->integer('user_id')->unsigned() // 0 to 4B ->bigInteger('bytes_transferred')->unsigned(); // 0 to 18E18
Auto-Increment Types:
// Auto-incrementing primary keys $table->increments('id') // UNSIGNED INT AUTO_INCREMENT ->bigIncrements('id') // UNSIGNED BIGINT AUTO_INCREMENT ->tinyIncrements('id') // UNSIGNED TINYINT AUTO_INCREMENT ->smallIncrements('id') // UNSIGNED SMALLINT AUTO_INCREMENT ->mediumIncrements('id'); // UNSIGNED MEDIUMINT AUTO_INCREMENT
Date & Time Types
Method | MySQL Type | Format | Description | Example |
---|---|---|---|---|
date($name) |
DATE | YYYY-MM-DD | Date only | ->date('birth_date') |
time($name, $precision) |
TIME | HH:MM:SS | Time only | ->time('meeting_time', 3) |
datetime($name, $precision) |
DATETIME | YYYY-MM-DD HH:MM:SS | Date and time | ->datetime('created_at', 3) |
timestamp($name, $precision) |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | Timestamp | ->timestamp('updated_at') |
year($name) |
YEAR | YYYY | Year only | ->year('copyright_year') |
Timestamp Helpers:
// Common timestamp patterns $table->timestamps() // created_at, updated_at ->timestampsTz() // With timezone ->softDeletes() // deleted_at ->softDeletesTz() // deleted_at with timezone ->rememberToken(); // Laravel-style remember token
Advanced Time Features:
// Time with automatic values $table->timestamp('created_at')->useCurrent() // DEFAULT CURRENT_TIMESTAMP ->timestamp('updated_at')->useCurrentOnUpdate() // ON UPDATE CURRENT_TIMESTAMP ->datetime('processed_at', 6)->nullable() // Microsecond precision ->time('duration', 3); // Millisecond precision
Binary Types
Method | MySQL Type | Size | Description | Example |
---|---|---|---|---|
binary($name, $length) |
BINARY | Fixed | Fixed-length binary | ->binary('hash', 32) |
varbinary($name, $length) |
VARBINARY | Variable | Variable-length binary | ->varbinary('data', 255) |
tinyBlob($name) |
TINYBLOB | 0-255 bytes | Tiny binary data | ->tinyBlob('thumbnail') |
blob($name) |
BLOB | 0-64KB | Binary data | ->blob('file_data') |
mediumBlob($name) |
MEDIUMBLOB | 0-16MB | Medium binary data | ->mediumBlob('image') |
longBlob($name) |
LONGBLOB | 0-4GB | Large binary data | ->longBlob('video') |
// Binary data examples $table->binary('uuid_binary', 16) // UUID as binary ->varbinary('encrypted_data', 500) // Encrypted content ->blob('profile_image') // Profile pictures ->mediumBlob('document') // PDF files ->longBlob('video_file'); // Video content
Specialized Types
Method | MySQL Type | Description | Example |
---|---|---|---|
json($name) |
JSON | JSON documents | ->json('metadata') |
enum($name, $values) |
ENUM | Enumerated values | ->enum('status', ['active', 'inactive']) |
set($name, $values) |
SET | Set of values | ->set('permissions', ['read', 'write']) |
boolean($name) |
TINYINT(1) | True/false values | ->boolean('is_active') |
uuid($name) |
CHAR(36) | UUID storage | ->uuid('external_id') |
ulid($name) |
CHAR(26) | ULID storage | ->ulid('session_id') |
Network & Address Types:
// Network-related data types $table->ipAddress('client_ip') // IPv4/IPv6 (45 chars) ->macAddress('device_mac') // MAC address (17 chars) ->url('website', 500) // URL storage ->email('contact_email'); // Email addresses
Geographic Types (MySQL 8.0+):
// Spatial data types $table->point('location') // POINT coordinates ->lineString('route') // LINESTRING paths ->polygon('area') // POLYGON regions ->multiPoint('locations') // Multiple points ->multiLineString('routes') // Multiple paths ->multiPolygon('areas') // Multiple regions ->geometry('shape') // Generic geometry ->geometryCollection('shapes'); // Collection of geometries
Polymorphic Types
Method | Description | Creates | Example |
---|---|---|---|
morphs($name) |
Polymorphic relation | {name}_id , {name}_type , index |
->morphs('commentable') |
nullableMorphs($name) |
Nullable polymorphic | {name}_id , {name}_type , index |
->nullableMorphs('taggable') |
uuidMorphs($name) |
UUID polymorphic | {name}_id (UUID), {name}_type |
->uuidMorphs('imageable') |
nullableUuidMorphs($name) |
Nullable UUID morphs | {name}_id (UUID), {name}_type |
->nullableUuidMorphs('attachable') |
// Polymorphic relationship examples $table->morphs('commentable'); // commentable_id, commentable_type // Equivalent to: // $table->unsignedInteger('commentable_id'); // $table->string('commentable_type'); // $table->index(['commentable_id', 'commentable_type']);
Data Type Usage Examples
E-commerce Product Table
$schema->createTable('products', function($table) { $table->increments('id'); $table->string('sku', 50)->unique(); $table->string('name', 200); $table->text('description')->nullable(); $table->decimal('price', 10, 2)->unsigned(); $table->decimal('compare_price', 10, 2)->unsigned()->nullable(); $table->smallInteger('stock_quantity')->unsigned()->default(0); $table->float('weight', 8, 2)->nullable(); $table->json('attributes')->nullable(); // Color, size, etc. $table->json('images')->nullable(); // Image URLs $table->boolean('featured')->default(false); $table->boolean('active')->default(true); $table->enum('status', ['draft', 'published', 'archived'])->default('draft'); $table->timestamps(); });
User Profile Table
$schema->createTable('user_profiles', function($table) { $table->increments('id'); $table->unsignedInteger('user_id')->unique(); $table->string('first_name', 50); $table->string('last_name', 50); $table->date('birth_date')->nullable(); $table->enum('gender', ['male', 'female', 'other'])->nullable(); $table->string('phone', 20)->nullable(); $table->text('bio')->nullable(); $table->json('preferences')->nullable(); $table->json('social_links')->nullable(); $table->blob('avatar')->nullable(); $table->ipAddress('last_login_ip')->nullable(); $table->timestamp('last_login_at')->nullable(); $table->timestamps(); $table->foreignKey('user_id', 'users', 'id', 'CASCADE'); });
Analytics & Logging Table
$schema->createTable('analytics_events', function($table) { $table->bigIncrements('id'); $table->uuid('session_id'); $table->string('event_type', 50); $table->string('event_name', 100); $table->json('properties')->nullable(); $table->json('context')->nullable(); $table->ipAddress('ip_address'); $table->string('user_agent', 500); $table->string('referrer', 500)->nullable(); $table->point('location')->nullable(); // Geographic location $table->timestamp('created_at', 6); // Microsecond precision // Optimized for time-series queries $table->index(['event_type', 'created_at']); $table->index(['session_id', 'created_at']); });
๐ง Column Modifiers
Column modifiers allow you to customize column behavior, constraints, and properties. SimpleMDB supports all MySQL column modifiers plus additional convenience methods.
Core Modifiers
Modifier | Description | Applies To | Example |
---|---|---|---|
nullable() |
Allow NULL values | All types | ->string('name')->nullable() |
default($value) |
Set default value | All types | ->integer('count')->default(0) |
comment($text) |
Add column comment | All types | ->string('email')->comment('User email') |
unsigned() |
Only positive values | Numeric types | ->integer('age')->unsigned() |
autoIncrement() |
Auto-increment | Numeric types | ->integer('id')->autoIncrement() |
Positioning Modifiers
Modifier | Description | Example |
---|---|---|
after($column) |
Position after column | ->string('middle_name')->after('first_name') |
first() |
Position as first column | ->string('priority')->first() |
String & Character Modifiers
Modifier | Description | Example |
---|---|---|
columnCharset($charset) |
Set column charset | ->string('name')->columnCharset('utf8mb4') |
columnCollation($collation) |
Set column collation | ->string('name')->columnCollation('utf8mb4_unicode_ci') |
Timestamp Modifiers
Modifier | Description | Example |
---|---|---|
useCurrent() |
DEFAULT CURRENT_TIMESTAMP | ->timestamp('created_at')->useCurrent() |
useCurrentOnUpdate() |
ON UPDATE CURRENT_TIMESTAMP | ->timestamp('updated_at')->useCurrentOnUpdate() |
MySQL 8.0+ Modifiers
Modifier | Description | Example |
---|---|---|
invisible() |
Hidden from SELECT * | ->string('internal_id')->invisible() |
Advanced Modifier Examples
Complete Column Customization
$table->string('product_name', 200) ->comment('SEO-optimized product name') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_unicode_ci') ->nullable(false) ->default('') ->after('sku') ->invisible(false);
Numeric Column with All Modifiers
$table->decimal('account_balance', 15, 2) ->unsigned() // Only positive values ->default(0.00) // Default balance ->comment('Account balance in USD') // Documentation ->nullable(false) // Required field ->after('account_id'); // Position after account_id
Timestamp Columns with Automatic Values
// Created timestamp - set once $table->timestamp('created_at', 6) ->useCurrent() // DEFAULT CURRENT_TIMESTAMP(6) ->comment('Record creation time') ->nullable(false); // Updated timestamp - auto-update $table->timestamp('updated_at', 6) ->useCurrent() // DEFAULT CURRENT_TIMESTAMP(6) ->useCurrentOnUpdate() // ON UPDATE CURRENT_TIMESTAMP(6) ->comment('Last modification time') ->nullable(false);
Text Columns with Charset/Collation
// Multi-language content $table->text('content') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_unicode_ci') ->comment('Multi-language content') ->nullable(true); // Case-insensitive search $table->string('search_term', 100) ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_general_ci') // Case-insensitive ->comment('Search term for indexing');
Invisible Columns (MySQL 8.0+)
// Internal tracking columns $table->uuid('internal_tracking_id') ->comment('Internal system tracking ID') ->invisible() // Hidden from SELECT * ->default('UUID()'); // Audit columns $table->json('audit_metadata') ->comment('Internal audit information') ->invisible() // Hidden from application ->nullable();
Modifier Combination Rules
Compatible Modifiers
// โ Valid combinations $table->string('name', 100) ->nullable() ->default('') ->comment('User name') ->after('id'); $table->integer('count') ->unsigned() ->default(0) ->comment('Item count'); $table->timestamp('created_at') ->useCurrent() ->comment('Creation timestamp');
Incompatible Modifiers
// โ Invalid: unsigned() only works with numeric types $table->string('name')->unsigned(); // Error! // โ Invalid: useCurrent() only works with timestamp types $table->string('name')->useCurrent(); // Error! // โ Invalid: columnCharset() only works with string types $table->integer('count')->columnCharset('utf8mb4'); // Error!
Practical Modifier Patterns
User Table with Complete Modifiers
$schema->createTable('users', function($table) { $table->increments('id'); // Name fields with proper charset $table->string('first_name', 50) ->comment('User first name') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_unicode_ci'); $table->string('last_name', 50) ->comment('User last name') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_unicode_ci'); // Email with case-insensitive collation $table->string('email', 150) ->unique() ->comment('User email address') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_general_ci'); // Secure password field $table->string('password', 255) ->comment('Encrypted password hash'); // Numeric fields with constraints $table->tinyInteger('age') ->unsigned() ->nullable() ->comment('User age in years'); $table->decimal('account_balance', 10, 2) ->unsigned() ->default(0.00) ->comment('Account balance in USD'); // Timestamp fields with automatic values $table->timestamp('created_at') ->useCurrent() ->comment('Account creation time'); $table->timestamp('updated_at') ->useCurrent() ->useCurrentOnUpdate() ->comment('Last profile update'); $table->timestamp('last_login_at') ->nullable() ->comment('Last login timestamp'); // Audit columns (invisible in MySQL 8.0+) $table->json('audit_trail') ->invisible() ->nullable() ->comment('Internal audit information'); });
Product Catalog with Advanced Modifiers
$schema->createTable('products', function($table) { $table->increments('id'); // Product identification $table->string('sku', 50) ->unique() ->comment('Stock Keeping Unit') ->columnCharset('ascii') ->columnCollation('ascii_general_ci'); // Multi-language product name $table->string('name', 200) ->comment('Product name (multi-language)') ->columnCharset('utf8mb4') ->columnCollation('utf8mb4_unicode_ci'); // Pricing with proper precision $table->decimal('price', 10, 2) ->unsigned() ->comment('Product price in USD'); $table->decimal('compare_price', 10, 2) ->unsigned() ->nullable() ->comment('Compare at price for discounts'); // Inventory tracking $table->smallInteger('stock_quantity') ->unsigned() ->default(0) ->comment('Available stock quantity'); // Product attributes $table->json('attributes') ->nullable() ->comment('Product attributes (color, size, etc.)'); // SEO and categorization $table->string('slug', 200) ->unique() ->comment('URL-friendly product identifier') ->columnCharset('ascii') ->columnCollation('ascii_general_ci'); // Status and visibility $table->boolean('active') ->default(true) ->comment('Product active status'); $table->boolean('featured') ->default(false) ->comment('Featured product flag'); // Timestamps $table->timestamp('created_at') ->useCurrent() ->comment('Product creation time'); $table->timestamp('updated_at') ->useCurrent() ->useCurrentOnUpdate() ->comment('Last modification time'); // Internal tracking (invisible) $table->uuid('internal_id') ->invisible() ->comment('Internal tracking UUID'); });
๐ง Advanced Column Modifiers
// Enterprise-grade column customization $table->string('title', 200) ->comment('SEO-optimized page title') // Self-documenting schemas ->columnCharset('utf8mb4') // Custom character sets ->columnCollation('utf8mb4_unicode_ci') // Specific collations ->nullable() // Allow NULL values ->default('Untitled') // Default values ->after('slug') // Position after column ->invisible(); // Hidden from SELECT * // Numeric modifiers $table->decimal('balance', 15, 2) ->unsigned() // Only positive values ->default(0.00) ->comment('Account balance in USD'); // Timestamp helpers $table->timestamp('created_at')->useCurrent() // DEFAULT CURRENT_TIMESTAMP ->timestamp('updated_at')->useCurrentOnUpdate() // ON UPDATE CURRENT_TIMESTAMP ->timestamp('deleted_at')->nullable(); // Soft deletes
๐ง Intelligent Migration System
SimpleMDB analyzes your migration names and generates context-aware templates:
// Migration: "create_users_table" // โจ Auto-generates complete user table with modern features php artisan migration:create create_users_table // Migration: "add_email_to_customers" // โจ Auto-detects VARCHAR(255) for email + unique constraint php artisan migration:create add_email_to_customers // Migration: "add_is_active_to_posts" // โจ Auto-detects BOOLEAN type for is_* fields php artisan migration:create add_is_active_to_posts
Generated Template Example:
// Intelligently generated based on migration name public function up(): void { $this->createTable('users', function($table) { $table->increments('id'); $table->string('name')->comment('Full name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->date('birth_date')->nullable(); $table->enum('status', ['active', 'inactive', 'pending'])->default('active'); $table->json('preferences')->nullable(); $table->ipAddress('last_login_ip')->nullable(); $table->rememberToken(); // Laravel-style auth token $table->timestamps(); // created_at, updated_at $table->softDeletes(); // deleted_at }); }
๐ก๏ธ Enterprise Security Features
100% SQL Injection Prevention
// All identifiers properly escaped $table->string('user-name') // Becomes `user-name` in SQL ->comment("User's full name"); // Becomes COMMENT 'User\'s full name' // All values parameterized $table->enum('status', ["'admin'", '"user"']) // Properly escaped enum values ->default("'pending'"); // Safe default handling
Comprehensive Input Validation
// 65+ MySQL reserved words detected $table->string('select'); // โ Error: 'select' is a MySQL reserved word // Length validation with helpful messages $table->string('title', 70000); // โ Error: VARCHAR length must be between 1 and 65535, got 70000 // Type compatibility checking $table->json('data')->unsigned(); // โ Error: unsigned() can only be used with numeric columns
๐ฆ Installation
Method 1: Composer (Recommended)
# Install the latest stable version composer require simple-mysqli/simple-mysqli # Install specific version composer require simple-mysqli/simple-mysqli:^2.0 # Install development version composer require simple-mysqli/simple-mysqli:dev-master
Method 2: Manual Installation
# Download and extract wget https://github.com/simple-mysqli/simple-mysqli/archive/master.zip unzip master.zip # Include in your project require_once 'simple-mysqli-master/simple-mysqli.php';
Method 3: Git Clone
git clone https://github.com/simple-mysqli/simple-mysqli.git cd simple-mysqli composer install # Install dependencies
Verify Installation
<?php require_once 'vendor/autoload.php'; use SimpleMDB\DatabaseFactory; use SimpleMDB\SchemaBuilder; // Test connection try { $db = DatabaseFactory::create('pdo', 'localhost', 'root', 'password', 'test'); echo "โ SimpleMDB installed successfully!\n"; echo "Version: " . SimpleMDB\SimpleMySQLi::VERSION . "\n"; } catch (Exception $e) { echo "โ Installation issue: " . $e->getMessage() . "\n"; }
โ๏ธ Configuration
Database Connection Configuration
Basic Configuration
use SimpleMDB\DatabaseFactory; // Basic PDO connection $config = [ 'driver' => 'pdo', 'host' => 'localhost', 'port' => 3306, 'database' => 'myapp', 'username' => 'root', 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci' ]; $db = DatabaseFactory::create($config);
Advanced Configuration
// Enterprise configuration with all options $config = [ 'driver' => 'pdo', 'host' => 'localhost', 'port' => 3306, 'database' => 'myapp', 'username' => 'root', 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', // SSL Configuration 'ssl' => [ 'key' => '/path/to/client-key.pem', 'cert' => '/path/to/client-cert.pem', 'ca' => '/path/to/ca-cert.pem', 'capath' => '/path/to/ca-certs-dir', 'cipher' => 'DHE-RSA-AES256-SHA' ], // Connection Options 'options' => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_FOUND_ROWS => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode='STRICT_TRANS_TABLES'" ], // Connection Pool Settings 'pool' => [ 'min_connections' => 5, 'max_connections' => 20, 'connection_timeout' => 30, 'idle_timeout' => 600, 'retry_attempts' => 3 ], // Caching Configuration 'cache' => [ 'driver' => 'redis', 'host' => 'localhost', 'port' => 6379, 'database' => 0, 'prefix' => 'simplemdb:', 'ttl' => 3600 ], // Debug and Profiling 'debug' => [ 'enabled' => true, 'log_queries' => true, 'slow_query_threshold' => 1000, // ms 'log_file' => '/var/log/simplemdb.log' ] ]; $db = DatabaseFactory::create($config);
Environment-Based Configuration
// Using environment variables $config = [ 'driver' => getenv('DB_DRIVER') ?: 'pdo', 'host' => getenv('DB_HOST') ?: 'localhost', 'port' => (int)getenv('DB_PORT') ?: 3306, 'database' => getenv('DB_DATABASE'), 'username' => getenv('DB_USERNAME'), 'password' => getenv('DB_PASSWORD'), 'charset' => getenv('DB_CHARSET') ?: 'utf8mb4', 'collation' => getenv('DB_COLLATION') ?: 'utf8mb4_unicode_ci', ]; // .env file example /* DB_DRIVER=pdo DB_HOST=localhost DB_PORT=3306 DB_DATABASE=myapp DB_USERNAME=root DB_PASSWORD=secret DB_CHARSET=utf8mb4 DB_COLLATION=utf8mb4_unicode_ci */
Multiple Database Connections
// Configure multiple databases $databases = [ 'primary' => [ 'driver' => 'pdo', 'host' => 'primary-db.example.com', 'database' => 'app_primary', 'username' => 'app_user', 'password' => 'primary_password' ], 'analytics' => [ 'driver' => 'pdo', 'host' => 'analytics-db.example.com', 'database' => 'app_analytics', 'username' => 'analytics_user', 'password' => 'analytics_password' ], 'cache' => [ 'driver' => 'pdo', 'host' => 'cache-db.example.com', 'database' => 'app_cache', 'username' => 'cache_user', 'password' => 'cache_password' ] ]; // Create connections $primaryDb = DatabaseFactory::create($databases['primary']); $analyticsDb = DatabaseFactory::create($databases['analytics']); $cacheDb = DatabaseFactory::create($databases['cache']);
๐ Quick Start Guide
1. Basic Database Connection
<?php require_once 'vendor/autoload.php'; use SimpleMDB\DatabaseFactory; use SimpleMDB\SchemaBuilder; use SimpleMDB\SimpleQuery; // Create database connection $db = DatabaseFactory::create('pdo', 'localhost', 'root', 'password', 'myapp'); // Test connection if ($db->ping()) { echo "Connected successfully!\n"; } else { echo "Connection failed!\n"; }
2. Create Your First Table
// Initialize schema builder $schema = new SchemaBuilder($db); // Create a users table with modern features $schema->increments('id') ->string('name', 100)->comment('User full name') ->string('email', 150)->unique() ->string('password', 255) ->boolean('is_active')->default(true) ->json('preferences')->nullable() ->ipAddress('last_login_ip')->nullable() ->timestamps() // created_at, updated_at ->softDeletes() // deleted_at ->createTable('users'); echo "โ Users table created successfully!\n";
3. Insert Data
// Insert a single user $userId = SimpleQuery::create() ->insert('users') ->values([ 'name' => 'John Doe', 'email' => 'john@example.com', 'password' => password_hash('secret123', PASSWORD_DEFAULT), 'is_active' => true, 'preferences' => json_encode(['theme' => 'dark', 'notifications' => true]) ]) ->execute($db); echo "โ User created with ID: $userId\n";
4. Query Data
// Find active users $users = SimpleQuery::create() ->select(['id', 'name', 'email', 'created_at']) ->from('users') ->where('is_active = ?', [true]) ->where('deleted_at IS NULL') ->orderBy('created_at DESC') ->limit(10) ->execute($db); echo "Found " . count($users) . " active users\n"; foreach ($users as $user) { echo "- {$user['name']} ({$user['email']})\n"; }
5. Update Data
// Update user preferences $affected = SimpleQuery::create() ->update('users') ->set([ 'preferences' => json_encode(['theme' => 'light', 'notifications' => false]), 'updated_at' => date('Y-m-d H:i:s') ]) ->where('id = ?', [$userId]) ->execute($db); echo "โ Updated $affected user(s)\n";
6. Your First Migration
use SimpleMDB\Migrations\MigrationManager; // Initialize migration manager $migrations = new MigrationManager($db); // Create a migration (generates intelligent template) $migrationFile = $migrations->create('create_blog_posts_table'); echo "โ Migration created: $migrationFile\n"; // Run all pending migrations $migrations->migrate(); echo "โ All migrations completed!\n"; // Check migration status foreach ($migrations->status() as $migration) { echo "๐ {$migration['name']}: {$migration['status']}\n"; }
๐๏ธ Schema Builder
The Schema Builder is SimpleMDB's powerful database schema management system that provides enterprise-grade features for creating, modifying, and managing database tables.
Core Concepts
1. Schema Builder Instance
use SimpleMDB\SchemaBuilder; // Create schema builder instance $schema = new SchemaBuilder($db); // Check if table exists if ($schema->hasTable('users')) { echo "Users table exists\n"; } // Get table column information $columns = $schema->getColumns('users'); foreach ($columns as $column) { echo "Column: {$column['name']} ({$column['type']})\n"; } // Drop table if exists $schema->dropIfExists('old_table');
2. Creating Tables
// Method 1: Fluent interface (recommended) $schema->increments('id') ->string('name', 100)->comment('User full name') ->string('email', 150)->unique() ->timestamps() ->createTable('users'); // Method 2: Callback syntax $schema->createTable('posts', function($table) { $table->increments('id'); $table->string('title', 200); $table->text('content'); $table->unsignedInteger('user_id'); $table->timestamps(); // Add foreign key constraint $table->foreignKey('user_id', 'users', 'id'); }); // Method 3: Advanced table creation $schema->createTable('products', function($table) { $table->increments('id'); $table->string('sku', 50)->unique(); $table->string('name', 200); $table->text('description')->nullable(); $table->decimal('price', 10, 2)->unsigned(); $table->json('attributes')->nullable(); $table->enum('status', ['active', 'inactive', 'discontinued'])->default('active'); $table->timestamps(); // Indexes $table->index(['name'], 'product_name_idx'); $table->index(['status', 'price'], 'status_price_idx'); $table->unique(['sku'], 'unique_sku'); });
3. Modifying Tables
// Add columns to existing table $schema->addColumn('users', 'phone', 'string', 20, [ 'nullable' => true, 'comment' => 'User phone number' ]); // Modify existing column $schema->modifyColumn('users', 'phone', 'string', 25, [ 'nullable' => false, 'default' => '' ]); // Drop column $schema->dropColumn('users', 'phone'); // Rename column $schema->renameColumn('users', 'phone', 'mobile_phone'); // Add index $schema->addIndex('users', ['email'], 'email_idx'); // Drop index $schema->dropIndex('users', 'email_idx');
4. Table Operations
// Rename table $schema->renameTable('old_users', 'users'); // Truncate table (remove all data) $schema->truncateTable('temporary_data'); // Drop table $schema->dropTable('unused_table'); // Drop table if exists $schema->dropIfExists('maybe_exists'); // Get table schema $tableSchema = $schema->getTableSchema('users'); print_r($tableSchema);
Advanced Schema Features
1. Constraints and Relationships
$schema->createTable('orders', function($table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->decimal('total', 10, 2); $table->timestamps(); // Foreign key constraint $table->foreignKey('user_id', 'users', 'id', 'CASCADE', 'CASCADE'); // Composite foreign key $table->foreignKey(['user_id', 'status'], 'user_status', ['user_id', 'status']); // Check constraint $table->checkConstraint('total > 0', 'positive_total'); }); // Add foreign key to existing table $schema->addForeignKey('orders', 'user_id', 'users', 'id'); // Drop foreign key $schema->dropForeignKey('orders', 'orders_user_id_foreign');
2. Indexes and Performance
$schema->createTable('search_index', function($table) { $table->increments('id'); $table->string('title', 200); $table->text('content'); $table->string('category', 50); $table->timestamps(); // Regular index $table->index(['category'], 'category_idx'); // Composite index $table->index(['category', 'created_at'], 'category_date_idx'); // Unique index $table->unique(['title'], 'unique_title'); // Full-text index $table->fullTextIndex(['title', 'content'], 'search_fulltext'); // Partial index (MySQL 8.0+) $table->partialIndex(['title'], 'active_titles', 'status = "active"'); });
3. Advanced Column Types
$schema->createTable('analytics', function($table) { $table->increments('id'); // Geographic data $table->point('location'); // POINT type for coordinates $table->polygon('area'); // POLYGON type for regions $table->lineString('route'); // LINESTRING type for paths // Large objects $table->mediumText('report'); // Up to 16MB text $table->longText('log_data'); // Up to 4GB text $table->mediumBlob('image'); // Up to 16MB binary $table->longBlob('video'); // Up to 4GB binary // Network data $table->ipAddress('client_ip'); // IPv4/IPv6 $table->macAddress('device_mac'); // MAC address // JSON and document storage $table->json('config'); // JSON data $table->jsonb('metadata'); // Binary JSON (if supported) // Time-series data $table->timestamp('event_time', 6); // Microsecond precision $table->time('duration', 3); // Millisecond precision $table->year('fiscal_year'); // Year only });
Schema Validation and Security
1. Column Name Validation
// SimpleMDB validates all column names try { $schema->string('user-name'); // โ Valid: hyphens allowed $schema->string('user_name'); // โ Valid: underscores allowed $schema->string('userName'); // โ Valid: camelCase allowed $schema->string('user name'); // โ Invalid: spaces not allowed $schema->string('select'); // โ Invalid: MySQL reserved word } catch (SimpleMDB\Exceptions\SchemaException $e) { echo "Schema error: " . $e->getMessage(); }
2. Data Type Validation
// Length validation try { $schema->string('title', 70000); // โ Invalid: VARCHAR max is 65535 $schema->decimal('price', 70, 2); // โ Invalid: DECIMAL max precision is 65 $schema->enum('status', []); // โ Invalid: ENUM needs values } catch (SimpleMDB\Exceptions\SchemaException $e) { echo "Validation error: " . $e->getMessage(); }
3. Modifier Compatibility
// Type compatibility checking try { $schema->json('data')->unsigned(); // โ Invalid: JSON can't be unsigned $schema->text('content')->after('id'); // โ Valid: positioning modifier $schema->string('name')->invisible(); // โ Valid: MySQL 8.0+ feature } catch (SimpleMDB\Exceptions\SchemaException $e) { echo "Modifier error: " . $e->getMessage(); }
Performance Optimization
1. Efficient Schema Building
// Batch operations for better performance $schema->startBatch(); // Add multiple columns efficiently $schema->string('first_name', 50); $schema->string('last_name', 50); $schema->string('email', 150); $schema->date('birth_date'); // Execute all operations at once $schema->createTable('users'); $schema->commitBatch();
2. Index Strategy
$schema->createTable('user_activities', function($table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->string('activity_type', 50); $table->timestamp('created_at'); // Optimized indexing strategy $table->index(['user_id', 'created_at'], 'user_timeline'); // Timeline queries $table->index(['activity_type', 'created_at'], 'type_timeline'); // Type filtering $table->index(['created_at'], 'created_at_idx'); // Date range queries });
Basic Schema Building Example
use SimpleMDB\DatabaseFactory; use SimpleMDB\SchemaBuilder; // Connect to database $db = DatabaseFactory::create('pdo', 'localhost', 'root', 'password', 'database'); $schema = new SchemaBuilder($db); // Create modern table with enterprise features $schema->increments('id') ->string('name')->comment('User full name') ->string('email')->unique() ->ipAddress('last_ip')->nullable() ->json('preferences')->nullable() ->enum('status', ['active', 'inactive'])->default('active') ->timestamps() ->softDeletes() ->createTable('users');
๐ Migration System
SimpleMDB's migration system provides intelligent, context-aware database schema management with automatic template generation and comprehensive rollback support.
Core Migration Concepts
1. Migration Manager
use SimpleMDB\Migrations\MigrationManager; // Initialize migration manager $migrations = new MigrationManager($db); // Set migration directory (optional) $migrations->setMigrationDirectory('./database/migrations'); // Set migration table name (optional) $migrations->setMigrationTable('schema_migrations');
2. Creating Migrations
// Create new migration with intelligent template $file = $migrations->create('create_users_table'); echo "Migration created: $file\n"; // Create with custom template $file = $migrations->create('add_email_to_customers', [ 'template' => 'add_column', 'table' => 'customers', 'column' => 'email', 'type' => 'string' ]);
3. Running Migrations
// Run all pending migrations $migrations->migrate(); // Run specific number of migrations $migrations->migrate(5); // Run migrations with output $migrations->migrate(null, true); // true for verbose output
4. Migration Status
// Check migration status $status = $migrations->status(); foreach ($status as $migration) { echo sprintf("%-40s %s\n", $migration['name'], $migration['status']); } // Check if migrations are pending if ($migrations->hasPendingMigrations()) { echo "Pending migrations found!\n"; }
Intelligent Template Generation
SimpleMDB analyzes migration names and generates context-aware templates automatically.
Pattern Recognition Examples
1. Create Table Pattern
// Migration name: "create_users_table" $migrations->create('create_users_table');
Generated Template:
<?php use SimpleMDB\Migrations\Migration; class CreateUsersTable extends Migration { public function up(): void { $this->createTable('users', function($table) { $table->increments('id'); $table->string('name')->comment('Full name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->boolean('is_active')->default(true); $table->json('preferences')->nullable(); $table->rememberToken(); $table->timestamps(); $table->softDeletes(); $table->index(['email']); $table->index(['created_at']); }); } public function down(): void { $this->dropIfExists('users'); } }
2. Add Column Pattern
// Migration name: "add_email_to_customers" $migrations->create('add_email_to_customers');
Generated Template:
<?php use SimpleMDB\Migrations\Migration; class AddEmailToCustomers extends Migration { public function up(): void { $this->addColumn('customers', function($table) { $table->string('email', 150) ->unique() ->comment('Customer email address') ->after('name'); // Intelligent positioning }); } public function down(): void { $this->dropColumn('customers', 'email'); } }
3. Add Index Pattern
// Migration name: "add_email_index_to_users" $migrations->create('add_email_index_to_users');
Generated Template:
<?php use SimpleMDB\Migrations\Migration; class AddEmailIndexToUsers extends Migration { public function up(): void { $this->addIndex('users', ['email'], 'users_email_index'); } public function down(): void { $this->dropIndex('users', 'users_email_index'); } }
4. Modify Table Pattern
// Migration name: "modify_products_table" $migrations->create('modify_products_table');
Generated Template:
<?php use SimpleMDB\Migrations\Migration; class ModifyProductsTable extends Migration { public function up(): void { $this->modifyTable('products', function($table) { // Add new columns $table->string('slug', 200)->unique()->after('name'); $table->decimal('compare_price', 10, 2)->unsigned()->nullable()->after('price'); $table->boolean('featured')->default(false)->after('active'); $table->json('seo_metadata')->nullable(); // Modify existing columns $table->modifyColumn('description', 'text', null, ['nullable' => true]); $table->modifyColumn('price', 'decimal', [10, 2], ['unsigned' => true]); // Add indexes $table->index(['slug']); $table->index(['featured', 'active']); $table->index(['price', 'compare_price']); }); } public function down(): void { $this->modifyTable('products', function($table) { $table->dropColumn(['slug', 'compare_price', 'featured', 'seo_metadata']); $table->dropIndex('products_slug_index'); $table->dropIndex('products_featured_active_index'); $table->dropIndex('products_price_compare_price_index'); }); } }
Smart Type Detection
SimpleMDB automatically detects appropriate column types based on column names:
Column Name Pattern | Detected Type | Example |
---|---|---|
*_id |
unsignedInteger |
user_id โ unsignedInteger('user_id') |
*_uuid |
uuid |
external_uuid โ uuid('external_uuid') |
*_at |
timestamp |
created_at โ timestamp('created_at') |
*_on |
date |
born_on โ date('born_on') |
is_* |
boolean |
is_active โ boolean('is_active') |
has_* |
boolean |
has_premium โ boolean('has_premium') |
*_count |
unsignedInteger |
view_count โ unsignedInteger('view_count') |
*_price |
decimal |
unit_price โ decimal('unit_price', 10, 2) |
*_amount |
decimal |
total_amount โ decimal('total_amount', 10, 2) |
*_email |
string |
contact_email โ string('contact_email', 150) |
*_url |
string |
website_url โ string('website_url', 500) |
*_ip |
ipAddress |
client_ip โ ipAddress('client_ip') |
*_mac |
macAddress |
device_mac โ macAddress('device_mac') |
*_data |
json |
config_data โ json('config_data') |
*_metadata |
json |
user_metadata โ json('user_metadata') |
Advanced Migration Features
1. Rollback Support
// Rollback last migration $migrations->rollback(); // Rollback specific number of migrations $migrations->rollback(3); // Rollback to specific migration $migrations->rollbackTo('20240101_120000_CreateUsersTable'); // Reset all migrations (dangerous!) $migrations->reset();
2. Migration Status and History
// Detailed migration history $history = $migrations->history(); foreach ($history as $migration) { echo sprintf( "%-40s %-10s %s\n", $migration['name'], $migration['status'], $migration['executed_at'] ?? 'Pending' ); } // Check if specific migration exists if ($migrations->hasMigration('create_users_table')) { echo "Users table migration exists\n"; } // Get migration file path $path = $migrations->getMigrationPath('create_users_table');
3. Batch Operations
// Run migrations in transaction $migrations->migrateInTransaction(); // Rollback migrations in transaction $migrations->rollbackInTransaction(2); // Dry run (show what would be executed) $migrations->dryRun();
4. Migration Seeding
// Migration with seeding class CreateCategoriesTable extends Migration { public function up(): void { $this->createTable('categories', function($table) { $table->increments('id'); $table->string('name', 100)->unique(); $table->string('slug', 100)->unique(); $table->text('description')->nullable(); $table->boolean('active')->default(true); $table->timestamps(); }); // Seed initial data $this->seed(); } public function down(): void { $this->dropIfExists('categories'); } private function seed(): void { $categories = [ ['name' => 'Technology', 'slug' => 'technology', 'description' => 'Tech products'], ['name' => 'Fashion', 'slug' => 'fashion', 'description' => 'Fashion items'], ['name' => 'Home', 'slug' => 'home', 'description' => 'Home products'], ]; foreach ($categories as $category) { $this->insert('categories', $category); } } }
Migration File Structure
Standard Migration Template
<?php use SimpleMDB\Migrations\Migration; class ExampleMigration extends Migration { /** * Run the migrations. */ public function up(): void { // Migration code here } /** * Reverse the migrations. */ public function down(): void { // Rollback code here } }
Advanced Migration with All Features
<?php use SimpleMDB\Migrations\Migration; class CreateEcommerceTables extends Migration { public function up(): void { // Create products table $this->createTable('products', function($table) { $table->increments('id'); $table->string('sku', 50)->unique(); $table->string('name', 200); $table->text('description')->nullable(); $table->decimal('price', 10, 2)->unsigned(); $table->json('attributes')->nullable(); $table->boolean('active')->default(true); $table->timestamps(); $table->index(['active', 'created_at']); $table->fullTextIndex(['name', 'description']); }); // Create product_categories table $this->createTable('product_categories', function($table) { $table->increments('id'); $table->unsignedInteger('product_id'); $table->unsignedInteger('category_id'); $table->timestamps(); $table->unique(['product_id', 'category_id']); $table->foreignKey('product_id', 'products', 'id', 'CASCADE'); $table->foreignKey('category_id', 'categories', 'id', 'CASCADE'); }); // Create product_reviews table $this->createTable('product_reviews', function($table) { $table->increments('id'); $table->unsignedInteger('product_id'); $table->unsignedInteger('user_id'); $table->tinyInteger('rating')->unsigned(); $table->text('comment')->nullable(); $table->boolean('verified_purchase')->default(false); $table->timestamps(); $table->index(['product_id', 'rating']); $table->index(['user_id', 'created_at']); $table->foreignKey('product_id', 'products', 'id', 'CASCADE'); $table->foreignKey('user_id', 'users', 'id', 'CASCADE'); }); } public function down(): void { $this->dropIfExists('product_reviews'); $this->dropIfExists('product_categories'); $this->dropIfExists('products'); } }
Migration CLI Commands
Command Examples
# Create new migration php migrate create create_users_table # Run all pending migrations php migrate up # Rollback last migration php migrate down # Check migration status php migrate status # Show migration history php migrate history # Reset all migrations (dangerous!) php migrate reset # Dry run (show SQL without executing) php migrate dry-run
Best Practices
1. Migration Naming
// โ Good naming conventions create_users_table add_email_to_customers modify_products_table drop_old_logs_table add_index_to_orders remove_unused_columns_from_posts // โ Poor naming conventions fix_stuff update_db migration_v2 temp_changes
2. Safe Migration Practices
public function up(): void { // โ Always check if table exists if (!$this->hasTable('users')) { $this->createTable('users', function($table) { // Table definition }); } // โ Check if column exists before adding if (!$this->hasColumn('users', 'email')) { $this->addColumn('users', 'email', 'string', 150); } // โ Use transactions for multiple operations $this->beginTransaction(); try { $this->addColumn('users', 'status', 'string', 20); $this->addIndex('users', ['status']); $this->commit(); } catch (Exception $e) { $this->rollback(); throw $e; } }
3. Rollback Safety
public function down(): void { // โ Always provide proper rollback $this->dropColumn('users', 'email'); // โ Check before dropping if ($this->hasTable('temporary_table')) { $this->dropTable('temporary_table'); } // โ Drop indexes before dropping columns $this->dropIndex('users', 'users_email_index'); $this->dropColumn('users', 'email'); }
Intelligent Migrations
use SimpleMDB\Migrations\MigrationManager; $migrations = new MigrationManager($db); // Create intelligent migration $file = $migrations->create('create_blog_posts_table'); // โจ Generates context-aware template with modern data types // Run migrations $migrations->migrate(); // Check status foreach ($migrations->status() as $migration) { echo "{$migration['name']}: {$migration['status']}\n"; }
Advanced Query Building
use SimpleMDB\SimpleQuery; // Complex queries with modern features $posts = SimpleQuery::create() ->select(['id', 'title', 'status', 'created_at']) ->from('blog_posts') ->where('status IN ?', [['published', 'featured']]) ->whereJsonContains('metadata->tags', 'php') ->orderBy('created_at DESC') ->limit(10) ->execute($db);
๐ Complete Feature Matrix
Category | Features |
---|---|
๐๏ธ Schema Builder | 25+ data types, 9+ modifiers, intelligent validation, polymorphic support |
๐ Migrations | Smart templates, up/down migrations, rollback, status tracking, auto-discovery |
๐ Query Builder | SELECT/INSERT/UPDATE/DELETE, CTEs, window functions, JSON operations, unions |
๐ Connections | PDO + MySQLi drivers, SSL/TLS, connection pooling, health checks, failover |
โก Performance | Redis/Memcached caching, query profiling, batch operations, retry logic |
๐ก๏ธ Security | SQL injection prevention, input validation, reserved word detection |
๐งช Development | Query debugging, error analysis, fake data generation, comprehensive logging |
๐ Monitoring | Query profiling, performance analysis, execution timing, memory tracking |
๐ง Advanced Examples
Polymorphic Relationships
// Create polymorphic relationship in one line $schema->increments('id') ->text('content') ->morphs('commentable') // Creates commentable_id + commentable_type + index ->timestamps() ->createTable('comments');
Complex Schema with All Features
$schema->increments('id') ->string('title', 200)->comment('SEO title')->after('id') ->text('content')->nullable() ->enum('status', ['draft', 'published', 'archived'])->default('draft') ->json('metadata')->nullable() ->decimal('price', 10, 2)->unsigned()->nullable() ->boolean('featured')->default(false) ->ipAddress('author_ip')->nullable() ->macAddress('device_fingerprint')->nullable() ->uuid('external_id')->unique() ->timestamps() ->softDeletes() ->index(['status', 'featured'], 'status_featured_index') ->createTable('products');
Migration with Intelligent Features
class CreateEcommerceTablessMigration extends Migration { public function up(): void { // Products table with modern e-commerce features $this->createTable('products', function($table) { $table->increments('id'); $table->string('sku', 50)->unique(); $table->string('name'); $table->text('description')->nullable(); $table->decimal('price', 10, 2)->unsigned(); $table->unsignedInteger('stock_quantity')->default(0); $table->json('attributes')->nullable(); // Color, size, etc. $table->enum('status', ['active', 'inactive', 'discontinued']); $table->timestamps(); $table->index(['status', 'price']); $table->index(['name']); // Full-text search ready }); // Orders with polymorphic address support $this->createTable('orders', function($table) { $table->increments('id'); $table->uuid('order_number')->unique(); $table->unsignedInteger('customer_id'); $table->decimal('total_amount', 10, 2); $table->enum('status', ['pending', 'processing', 'shipped', 'delivered']); $table->morphs('billing_address'); // Polymorphic addresses $table->morphs('shipping_address'); $table->ipAddress('order_ip'); $table->timestamps(); $table->foreignKey('customer_id', 'users', 'id'); }); } }
๐ Documentation Roadmap
We're planning comprehensive documentation to match our enterprise status:
Phase 1: Core Documentation (Coming Soon)
- ๐ Complete API Reference - Every method, parameter, and return type
- ๐ฏ Migration Guide - From Laravel/Doctrine to SimpleMDB
- ๐ก๏ธ Security Best Practices - Enterprise-grade security guidelines
- โก Performance Optimization - Caching, indexing, query optimization
Phase 2: Advanced Guides (Planned)
- ๐๏ธ Schema Design Patterns - Best practices for complex schemas
- ๐ Advanced Migration Strategies - Large-scale database changes
- ๐งช Testing & Development - Testing database schemas and migrations
- ๐ Monitoring & Debugging - Production database management
Phase 3: Multi-Database Support (Future)
- ๐ง PostgreSQL Support - Full feature parity for PostgreSQL
- ๐๏ธ SQLite Support - Development and testing workflows
- โ๏ธ Cloud Database Guides - AWS RDS, Google Cloud SQL, Azure
๐ค Contributing
SimpleMDB is now an enterprise-grade framework, and we welcome contributions that maintain our high standards:
- ๐ Bug Reports - Detailed issues with reproducible examples
- โจ Feature Requests - Enterprise features that add real value
- ๐ Documentation - Help us build world-class docs
- ๐งช Testing - Comprehensive test coverage for all features
๐ License
MIT License - Use SimpleMDB in any project, commercial or open source.
SimpleMDB is now production-ready for enterprise applications. Join the growing community of developers who choose SimpleMDB for its combination of power, security, and developer experience.
๐ Star us on GitHub if SimpleMDB helps you build better applications!