Unified PDO-based DB class. Migrations, seeding, rollbacks. Use it or swap in Eloquent/Doctrine.
Set creds in .env:
DB_HOST=localhost
DB_NAME=strata
DB_USER=root
DB_PASS=secret
DB_PREFIX=strata_
Access via config('database') or the DB class.
All database access uses the unified DB class. No legacy mysqli code.
use Strata\Database\DB;
// Query
$users = DB::query('SELECT * FROM users WHERE active =?', [1])->fetchAll();
// Insert
$userId = DB::insert('users', [
'email' => 'barry@example.com',
'name' => 'Barry',
]);
// Update
DB::update('users', ['name' => 'Barry Smith'], ['id' => $userId]);
// Transaction
DB::transaction(function() {
DB::insert('orders', [...]);
DB::update('inventory', [...]);
});
Parameterized queries only. Prevents SQL injection by default.
Schema changes are versioned. Never edit the DB directly.
php bin/migrate.php # Apply all new migrations
php bin/rollback.php 2 # Roll back last 2 migrations
php bin/migration_status.php # Show applied/pending
php bin/create_migration.php AddUsersTable # Scaffold new migration
File: migrations/20250829120000_CreateUsersTable.php
<?php
use Strata\Database\Migration;
return new class extends Migration {
public function up(): void {
$this->schema->create('users', function($table) {
$table->id();
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
public function down(): void {
$this->schema->drop('users');
}
};
Always create a down() method. Migration locking prevents concurrent runs in CI.
Populate DB with test/demo data:
php bin/seed.php # Run all seeds/
php bin/seed.php --down # Remove seeded data
File: seeds/UserSeeder.php
<?php
use Strata\Database\Seeder;
return new class extends Seeder {
public function run(): void {
DB::insert('users', [
'email' => 'admin@example.com',
'password' => password_hash('secret', PASSWORD_DEFAULT),
]);
}
public function down(): void {
DB::query('DELETE FROM users WHERE email =?', ['admin@example.com']);
}
};
Don’t want the DB class? Bring Eloquent:
composer require illuminate/database
// app/config.php
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule;
$capsule->addConnection(config('database'));
$capsule->setAsGlobal();
$capsule->bootEloquent();
Strata doesn’t care. PSR-11 means you can inject Eloquent models into routes just like the DB class.