thibaud-dt/trinitycore-models
Eloquent models for TrinityCore, the World of Warcraft server emulator database, letting Laravel apps query auth, characters and world tables through familiar Eloquent relationships instead of raw SQL.
Architecture fit
trinitycore-models is an Eloquent model layer over the TrinityCore schema (auth / characters / world databases), not an application package. It fits as a read-mostly persistence adapter behind an admin/GM tool, armory site, or analytics job — not as a domain layer. There are no migrations, so the package asserts that the host schema is authoritative; our app must treat TrinityCore as the system of record and this package as a typed access shim. The -dev suffix and 0.1.x version mean the public surface (model class names, namespaces, relationship methods) is not yet stable and should be assumed to churn.
Integration feasibility
Feasible for a Laravel app today, with caveats. Requires at least three named connections (auth, characters, world), which may live on different hosts — Eloquent cannot join across connections, so any cross-database reporting must be done in application code or via a separate read model. Non-idiomatic schema details must be verified: $timestamps = false, non-id primary keys (guid, account), integer Unix timestamps (last_login), and no soft deletes. The 0.1.1 claim "all models available" refers to class coverage only; relationships are limited to Account, so eager loading and with() usage will be largely unavailable and N+1 exposure is high.
Technical risk
-dev tag, single narrow release history, no stated test/CI posture. Treat as unstable dependency.Hash facade will silently produce unusable accounts. This is the highest-severity trap.Key questions
illuminate/database a loose or pinned constraint?$connection, config keys, or hardcoded names?Stack fit
Works with a standard Laravel service-container app via Composer; no service provider contract is documented, so assume plain composer require plus connection config. Best initial fit is read-only: GM dashboards, character/account lookup, auction or economy analytics, and community armory pages. Poor fit for anything that must own the account lifecycle without additional SRP6 handling.
Migration path There is no data migration — the existing TrinityCore databases are the source of truth. "Migration" here means connection wiring and de-risking:
auth, characters, world connections in config/database.php, with the world connection typically read-only credentials.^0.1), and vendor/fork if the maintainer stalls.Compatibility
Verify Laravel major, PHP minor, and whether the world DB (item_template, creature_template, quest tables) is supported at the column granularity we need — these tables are extremely wide and historically change between expansions. Confirm model $connection targeting, $table naming (including any _db prefixes), and that no model assumes the auth DB is the default connection.
Sequencing
Phase 1: read-only reporting on auth and characters (lowest blast radius, most relationship coverage). Phase 2: world-data reference lookups with aggressive query scoping and caching. Phase 3: write paths (account/ban/GM actions) only after SRP6 and schema-drift behavior are proven in staging against a real TrinityCore build. Defer any dependency on relationships beyond Account until 0.2+.
Maintenance Expect to re-validate on every TrinityCore/TDB update and every package bump. Budget for a pinned-version upgrade cadence rather than continuous updates. If we fork, we own schema regeneration — a nontrivial ongoing task given world-table breadth. No migrations means our deploy pipeline is unaffected, but our integration tests must assert against a seeded TrinityCore schema snapshot.
Support Likely single-maintainer, community-issue support with no SLA and no documented deprecation policy. Escalation path must be "fork and patch," so keep the adapter boundary thin and the model usage centralized. Document internal ownership for the SRP6 account path explicitly.
Scaling
Read-heavy dashboards will scale fine with standard caching and indexed lookups. Risk concentrates in character and world tables: large row counts, wide rows, and unindexed legacy columns make unbounded all()/get() calls dangerous. Enforce pagination, explicit select(), chunked jobs for exports, and a separate read replica for the world DB. Without relationship coverage, N+1 will be the dominant scaling failure unless queries are hand-optimized.
Failure modes
$connection (fails open, not loudly).updated_at/created_at write attempts against tables lacking those columns.Ramp-up
Low for a Laravel developer, moderate for anyone lacking TrinityCore domain knowledge — the schema's naming (guid, account, per-expansion tables) and auth mechanics are the real learning curve, not the package. Allocate time for a schema orientation session and a documented conventions page (connections, key names, no-timestamps, read-only rules) before the first feature. One to two days for a competent Laravel engineer on read-only work; add a week of staging validation before any write path.
How can I help you explore Laravel packages today?