Schema Manager w PHP - Deklaratywne Tworzenie Struktury Bazy Danych

06.08.2025

Schema Manager w PHP - Deklaratywne Tworzenie Struktury Bazy Danych

Czym jest Schema Manager?

Schema Manager to warstwa abstrakcji pozwalająca na zarządzanie strukturą bazy danych przy użyciu obiektowego API zamiast surowego SQL. Dzięki temu definiujesz tabele, kolumny i indeksy w sposób type-safe, niezależny od silnika bazy danych.

Dlaczego warto używać Schema Manager?

  • Kod PHP zamiast surowego SQL - lepsza czytelność i IDE support
  • Type safety - błędy wykrywane na etapie developmentu
  • Niezależność od silnika bazy (MySQL, PostgreSQL, SQLite)
  • Łatwa modyfikacja struktury poprzez obiektowe API

System typów kolumn

Zamiast pisać VARCHAR(255) lub INT AUTO_INCREMENT, używasz dedykowanych klas reprezentujących typy MySQL:

Podstawowe typy kolumn

<?php
// IntColumn - liczby całkowite
new IntColumn(
    name: 'id',
    length: 11,
    nullable: false,
    autoIncrement: true,
    unsigned: true
);

// VarcharColumn - stringi o zmiennej długości
new VarcharColumn(
    name: 'email',
    length: 255,
    nullable: false,
    defaultValue: null
);

// TextColumn - długie teksty
new TextColumn(
    name: 'description',
    nullable: true
);

// DateTimeColumn - daty i czas
new DateTimeColumn(
    name: 'created_at',
    nullable: false,
    current: true // CURRENT_TIMESTAMP
);

// EnumColumn - wyliczenia
new EnumColumn(
    name: 'status',
    values: ['active', 'inactive', 'pending'],
    defaultValue: 'pending'
);

Tworzenie tabel - praktyczny przykład

Stwórzmy kompletną tabelę użytkowników z różnymi typami kolumn:

<?php
use DJWeb\Framework\DBAL\Schema\Schema;
use DJWeb\Framework\DBAL\Schema\Columns\*;

$schema->createTable('users', [
    new IntColumn('id', nullable: false, autoIncrement: true),
    new VarcharColumn('name', length: 100),
    new VarcharColumn('email', length: 255),
    new VarcharColumn('password', length: 255),
    new EnumColumn('role', ['admin', 'user', 'moderator'], defaultValue: 'user'),
    new DateTimeColumn('created_at', current: true),
    new DateTimeColumn('updated_at', nullable: true),
    new PrimaryColumn('id'),
]);

// Wygenerowany SQL:
// CREATE TABLE users (
//     id INT(11) NOT NULL AUTO_INCREMENT,
//     name VARCHAR(100),
//     email VARCHAR(255),
//     password VARCHAR(255),
//     role ENUM('admin', 'user', 'moderator') DEFAULT 'pending',
//     created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
//     updated_at DATETIME NULL,
//     PRIMARY KEY (id)
// );

Zarządzanie indeksami

Indeksy przyspieszają wyszukiwanie w bazie. Schema Manager oferuje wygodne metody do ich tworzenia:

<?php
// Unikalny indeks - email musi być unikalny
$schema->uniqueIndex('users', 'unique_users_email', 'email');

// Indeks kompozytowy - przyspieszenie wyszukiwania
$schema->createIndex('users', 'idx_name_email', ['name', 'email']);

// Klucz główny (jeśli nie został dodany w createTable)
$schema->primary('users', 'id');

// Usunięcie indeksu
$schema->dropIndex('users', 'idx_name_email');

Modyfikacja istniejących tabel

Schema Manager pozwala na łatwą modyfikację struktury bez usuwania tabeli:

<?php
// Dodanie nowej kolumny
$schema->addColumn('users', new VarcharColumn('phone', length: 20));

// Modyfikacja kolumny
$schema->modifyColumn('users', new VarcharColumn('name', length: 150));

// Usunięcie kolumny
$schema->dropColumn('users', 'phone');

// Zmiana nazwy tabeli
$schema->renameTable('users', 'app_users');

Architektura - wzorzec Facade

Klasa Schema to facade łącząca specjalistycznych managerów:

  • TableManager - tworzenie, modyfikacja, usuwanie tabel
  • ColumnManager - zarządzanie kolumnami
  • IndexManager - zarządzanie indeksami
  • DatabaseInfo - pobieranie informacji o strukturze

Dzięki tej separacji każda klasa ma pojedynczą odpowiedzialność (Single Responsibility Principle).

Transakcje - atomowość operacji

Schema wspiera transakcje - wiele operacji może być wykonanych jako jedna atomowa jednostka:

<?php
try {
    $schema->transaction->begin();

    $schema->createTable('orders', [...]);
    $schema->createTable('order_items', [...]);
    $schema->uniqueIndex('orders', 'unique_order_number', 'order_number');

    $schema->transaction->commit();
} catch (\Exception $e) {
    $schema->transaction->rollback();
    throw $e;
}

Praktyczne zastosowanie

Schema Manager jest fundamentem systemu migracji. Przykład z prawdziwego projektu:

<?php
// Migracja tworząca tabelę produktów
public function up(): void
{
    $this->schema->createTable('products', [
        new IntColumn('id', nullable: false, autoIncrement: true),
        new VarcharColumn('name'),
        new TextColumn('description'),
        new IntColumn('price', unsigned: true),
        new IntColumn('category_id'),
        new EnumColumn('status', ['draft', 'published', 'archived']),
        new DateTimeColumn('created_at', current: true),
        new PrimaryColumn('id'),
    ]);

    $schema->createIndex('products', 'idx_category', 'category_id');
    $schema->createIndex('products', 'idx_status', 'status');
}

🎓 Naucz się budować Schema Manager od podstaw!

W kursie PHP 8.4 implementujesz kompletny Schema Manager - od Connection przez Column types, aż po TableManager z CREATE/ALTER/DROP. Pełna implementacja z testami jednostkowymi.

Kup pełny kurs PHP 8.4 🚀 Pobierz darmowy fragment 📥

Zobacz też inne artykuły o DBAL