Описание схемы

Определите структуру БД в PHP или YAML.

Содержание

Форматы схемы

Rowcast Schema поддерживает три формата. Парсер выбирается автоматически по пути в schema:

  • путь к директории -> парсер атрибутов
  • файл .php -> PHP-парсер
  • файл .yaml / .yml -> YAML-парсер

PHP-формат (по умолчанию, без зависимостей)

<?php

return [
    'tables' => [
        'users' => [
            'columns' => [
                'id' => ['type' => 'integer', 'primaryKey' => true, 'autoIncrement' => true],
                'email' => ['type' => 'string', 'length' => 255],
            ],
            'indexes' => [
                'idx_users_email' => ['columns' => ['email'], 'unique' => true],
            ],
        ],
    ],
];

YAML-формат (требует symfony/yaml)

tables:
  users:
    columns:
      id:
        type: integer
        primaryKey: true
        autoIncrement: true
      email:
        type: string
        length: 255
    indexes:
      idx_users_email:
        columns: [email]
        unique: true

YAML-поддержка опциональна. Установите composer require symfony/yaml. Если пакет отсутствует и указан .yaml-файл, парсер выбросит понятную ошибку с инструкцией по установке.

Формат с атрибутами (директория с PHP-классами)

// rowcast-schema.php
return [
    'connection' => [
        'dsn' => 'mysql:host=localhost;dbname=app',
        'username' => 'root',
        'password' => 'secret',
    ],
    'schema' => __DIR__ . '/src/Entity',
    'migrations' => __DIR__ . '/migrations',
];
use AsceticSoft\RowcastSchema\Attribute\Column;
use AsceticSoft\RowcastSchema\Attribute\Table;

#[Table]
final class User
{
    #[Column(primaryKey: true, autoIncrement: true)]
    public int $id;

    #[Column(length: 255)]
    public string $email;
}

Поддерживаемые абстрактные типы

Тип Описание
integer INT / INTEGER
smallint SMALLINT
bigint BIGINT
string VARCHAR (длина по умолчанию: 255)
text TEXT
boolean BOOLEAN / TINYINT(1)
decimal DECIMAL (требует precision, scale)
float FLOAT
double DOUBLE
datetime DATETIME
date DATE
time TIME
timestamp TIMESTAMP
timestamptz TIMESTAMPTZ
uuid CHAR(36) / UUID
json JSON / TEXT
binary BLOB / BYTEA
enum ENUM (требует values)

Кастомные типы БД

Можно передавать vendor-specific типы как строку в type:

'columns' => [
    'embedding' => ['type' => 'vector(1536)', 'nullable' => true],
    'title_ci' => ['type' => 'citext'],
],

Неизвестные типы сохраняются как custom databaseType и попадают в SQL без изменений. Это работает для pgvector, citext, PostGIS и других специфичных типов.


Параметры колонки

Параметр Тип По умолч. Описание
type string обязат. Абстрактный тип
nullable bool false Разрешить NULL
default mixed null Значение по умолчанию
primaryKey bool false Первичный ключ
autoIncrement bool false Автоинкремент
length int 255 для string Длина для string
precision int null Точность для decimal
scale int null Масштаб для decimal
unsigned bool false Беззнаковое целое
comment string null Комментарий
values list [] Значения для enum

Параметры таблицы

Параметр Тип Описание
columns map Определения колонок (обязательно)
primaryKey list Составной первичный ключ
indexes map Именованные индексы
foreignKeys map Внешние ключи
engine string MySQL engine (напр. InnoDB)
charset string MySQL charset
collation string MySQL collation

Индексы

'indexes' => [
    'idx_users_email' => [
        'columns' => ['email'],
        'unique' => true,
    ],
],

Внешние ключи

'foreignKeys' => [
    'fk_orders_user' => [
        'columns' => ['user_id'],
        'references' => [
            'table' => 'users',
            'columns' => ['id'],
        ],
        'onDelete' => 'cascade',
    ],
],

Составной первичный ключ

'order_items' => [
    'columns' => [
        'order_id' => ['type' => 'integer'],
        'position' => ['type' => 'integer'],
        'product_id' => ['type' => 'integer'],
    ],
    'primaryKey' => ['order_id', 'position'],
],