semitexa / orm
Semitexa ORM — attribute-driven schema, connection pooling, MySQL adapter
Requires
- php: ^8.4
- semitexa/core: *
- semitexa/tenancy: *
Requires (Dev)
- swoole/ide-helper: ^5.1
- dev-master
- 2026.04.21.2047
- 2026.04.21.0704
- 2026.04.15.1848
- 2026.04.15.0921
- 2026.04.14.1121
- 2026.04.13.0911
- 2026.04.12.1209
- 2026.04.09.1145
- 2026.04.07.1133
- 2026.04.05.0855
- 2026.04.03.1349
- 2026.04.03.1240
- 1.0.23
- v1.0.22
- 1.0.20
- v1.0.18
- v1.0.17
- v1.0.16
- v1.0.15
- v1.0.14
- v1.0.13
- v1.0.11
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- dev-develop
- dev-chore/phpstan-baseline-cleanup
This package is auto-updated.
Last update: 2026-04-25 13:38:32 UTC
README
Attribute-driven ORM with schema definition, connection pooling, and MySQL 8.0+ support.
Schema migrations are owned by this package.
orm:diff(preview) andorm:sync(apply) are the only entry points that change database structure. Other Semitexa packages — includingsemitexa/update— must not issue schema DDL; they call ORM through a public seam and the ORM remains the source of truth for what the schema should look like. Post-schema data patches (backfills, normalizations) belong tosemitexa/update.
Purpose
Maps PHP classes to database tables using PHP 8.4 attributes. Provides Swoole-compatible connection pooling, typed column definitions, relation mapping, and a filtering architecture with auto-indexed filterable fields.
The source of truth for schema is the entity classes themselves (#[FromTable], #[Column], #[Index], #[BelongsTo]/#[HasMany]/etc.). There is no canonical migrations/ directory in a Semitexa project — the diff/sync engine produces the necessary DDL from the entity model, applies safe-rename / deprecate-then-drop policies, and gates destructive operations behind an explicit operator opt-in.
Role in Semitexa
Depends on Core and Tenancy. Depended on by Cache, Media, Scheduler, Search, Storage, Workflow, and Platform modules. Central persistence layer for all database-backed functionality.
Key Features
#[FromTable],#[Column],#[PrimaryKey],#[Index]for schema definition- Relations:
#[BelongsTo],#[HasMany],#[OneToOne],#[ManyToMany] #[Filterable]with auto-indexing and typedfilterByX()methods#[Aggregate]for virtual computed fields- Traits:
HasTimestamps,SoftDeletes,HasUuid,HasUuidV7(BINARY(16) chronological) - Domain mapping via
ResourceModel,#[AsMapper], andDomainRepository - Swoole
Channel-based connection pool - MySQL 8.0+ with version detection and capability checks
SchemaCollectorfor attribute-driven schema sync
Notes
ORM resources go in Application/Db/MySQL/Model/. Domain entities live in Domain/Model/. The Resource folder is reserved for response DTOs. Connection pooling is Swoole-native using Channel-based leasing.
Operator commands
| Command | Purpose |
|---|---|
orm:status |
Show driver capabilities, schema summary, and pending diff |
orm:diff |
Print the DDL plan to bring the database in sync with the entity model |
orm:sync |
Execute the DDL plan; supports --dry-run and --allow-destructive |
orm:seed |
Apply data seeds (fixture data) declared by entity factories |
Update orchestration calls orm:sync through Semitexa\Update\Migration\OrmMigrationGatewayInterface — never by reaching into ORM internals.