Database

Unified PDO-based DB class. Migrations, seeding, rollbacks. Use it or swap in Eloquent/Doctrine.

Configuration

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.

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.

Migrations

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

Example 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.

Seeding

Populate DB with test/demo data:

php bin/seed.php # Run all seeds/
php bin/seed.php --down # Remove seeded data

Example Seed

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']);
    }
};

Using an ORM

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.