22
33### Type-safe database schema constants para PHP
44
5- [ ![ Latest Version] ( https://img.shields.io/packagist/v/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class ) [ ![ PHP Version] ( https://img.shields.io/packagist/php-v/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class ) [ ![ License] ( https://img.shields.io/packagist/l/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class ) [ ![ Downloads] ( https://img.shields.io/packagist/dt/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class ) [ ![ Stars] ( https://img.shields.io/github/stars/erilshackle/tbl-class-php?style=social )] ( https://github.com/erilshackle/tbl-class-php )
5+ [ ![ Latest Version] ( https://img.shields.io/packagist/v/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class )
6+ [ ![ PHP Version] ( https://img.shields.io/packagist/php-v/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class )
7+ [ ![ License] ( https://img.shields.io/packagist/l/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class )
8+ [ ![ Downloads] ( https://img.shields.io/packagist/dt/eril/tbl-class )] ( https://packagist.org/packages/eril/tbl-class )
9+ [ ![ Stars] ( https://img.shields.io/github/stars/erilshackle/tbl-class-php?style=social )] ( https://github.com/erilshackle/tbl-class-php )
610
711---
812
913## O que é o tbl-class?
1014
11- ** TBL-CLASS** é uma ferramenta ** CLI para PHP** que gera ** classes com constantes type-safe** directamente a partir do ** esquema do seu banco de dados** .
15+ ** TBL-CLASS** é uma ferramenta ** CLI para PHP** que gera ** classes com constantes type-safe** diretamente a partir do ** esquema do seu banco de dados** .
1216
13- Permite referenciar ** tabelas, colunas, foreign keys e valores enum** sem recorrer a strings mágicas, tornando o código:
17+ Permite referenciar ** tabelas, colunas, foreign keys, joins e valores enum** sem recorrer a strings mágicas, tornando o código:
1418
1519* mais seguro
1620* mais legível
@@ -27,7 +31,7 @@ Permite referenciar **tabelas, colunas, foreign keys e valores enum** sem recorr
2731* Constantes ** type-safe e centralizadas**
2832* Detecção de alterações no esquema via ** hash**
2933* Compatível com ** MySQL, PostgreSQL e SQLite**
30- * Classes organizadas: ` Tbl ` , ` TblFk ` , ` TblEnum `
34+ * Helpers de ** JOIN baseados em foreign keys **
3135* Interface CLI simples e previsível
3236* Integração nativa com Composer
3337
@@ -41,9 +45,8 @@ Exemplo:
4145
4246``` php
4347Tbl::users
44- Tbl::users_id
45- TblFk::posts_users
46- TblEnum::users_status_active
48+ Tbl::users__id
49+ Tbl::on__posts__users
4750```
4851
4952Isto garante:
@@ -86,6 +89,11 @@ database:
8689 user : env(DB_USER)
8790 password : env(DB_PASS)
8891` ` `
92+ ou usando callback
93+ ` ` ` yaml
94+ database :
95+ connection : " class::method"
96+ ` ` `
8997
9098---
9199
@@ -97,9 +105,8 @@ php vendor/bin/tbl-class
97105
98106É gerado o ficheiro ` Tbl.php ` contendo:
99107
100- * ` Tbl ` → tabelas, colunas e aliases
101- * ` TblFk ` → foreign keys
102- * ` TblEnum ` → valores enum
108+ * ` Tbl ` → tabelas, colunas e JOIN helpers
109+ * enums e metadata de schema
103110
104111---
105112
@@ -111,112 +118,113 @@ php vendor/bin/tbl-class --check
111118
112119---
113120
114- ## 📁 Exemplo de Código Gerado
121+ ## 🔗 JOIN Helpers (v1.1.0)
122+
123+ A partir da ** v1.1.0** , o ` tbl-class ` gera automaticamente ** helpers de JOIN** com base nas ** foreign keys reais do schema** .
124+
125+ ### Constantes geradas
126+
127+ Para uma foreign key:
128+
129+ ```
130+ posts.user_id → users.id
131+ ```
132+
133+ é gerada a constante:
115134
116135``` php
117- <?php
136+ public const on__posts__users = 'posts.user_id = users.id';
137+ ```
118138
119- final class Tbl
120- {
121- /** table: users (alias: u) */
122- public const users = 'users';
139+ ---
123140
124- /** `users`.`id` */
125- public const users__id = 'id';
141+ ### Uso direto
126142
127- /** `users`.`email` */
128- public const users__email = 'email';
143+ ``` php
144+ Tbl::on__posts__users();
145+ // posts.user_id = users.id
146+ ```
129147
130- /** posts.user_id → users.id */
131- public const fk__posts__users = 'user_id';
132-
133- public const enum__users__active = 'active';
134- public const enum__users__pending = 'pending';
135- public const enum__users__inactive = 'inactive';
136- }
148+ ---
137149
138- final class Tbk
139- {
140- // futuramente dedicado aos PK, FK e UK
141- }
150+ ### Uso com aliases (via __ callStatic)
142151
143- final class Tbe
144- {
145- // futuramente - dedicado aos enums
146- }
152+ ``` php
153+ Tbl::on__posts__users('p', 'u');
154+ // p.user_id = u.id
147155```
148156
149157---
150158
151- ## 🔧 Configuração Completa ( ` tblclass.yaml ` )
159+ ### Helper de alias de tabela
152160
153- ``` yaml
154- include : null
161+ ``` php
162+ Tbl::users('u');
163+ // users AS u
164+ ```
155165
156- database :
157- connection : null
158- driver : mysql # mysql | pgsql | sqlite
166+ ---
159167
160- host : env(DB_HOST)
161- port : env(DB_PORT)
162- name : env(DB_NAME)
163- user : env(DB_USER)
164- password : env(DB_PASS)
168+ ### Exemplo completo de SQL
165169
166- # sqlite
167- # path: env(DB_PATH)
170+ ``` php
171+ $sql = "
172+ SELECT *
173+ FROM " . Tbl::users('u') . "
174+ JOIN " . Tbl::posts('p') . "
175+ ON " . Tbl::on__posts__users('p', 'u') . "
176+ WHERE u.status = ?
177+ ";
178+ ```
168179
169- output :
170- path : " ./"
171- namespace : " "
180+ ---
172181
173- naming :
174- strategy : full # full | short | alias
182+ ## 📁 Exemplo de Código Gerado
175183
176- abbreviation :
177- max_length : 15
178- dictionary_lang : en # en | pt | es | all
179- dictionary_path : null
184+ ``` php
185+ final class Tbl
186+ {
187+ /** TABLE: users */
188+ public const users = 'users';
189+
190+ /** COLUMN: users.id */
191+ public const users__id = 'id';
192+
193+ /** JOIN: posts.user_id = users.id */
194+ public const on__posts__users = 'posts.user_id = users.id';
195+
196+ }
180197```
181198
182199---
183200
184201## 🧠 Estratégias de Nomenclatura
185202
186- Naming strategy is global and applied consistently to tables, columns, foreign keys and enums.
187- Changing the strategy is a breaking change and should be treated as a refactor.
203+ Naming strategy é global e aplicada consistentemente a tabelas, colunas, joins e enums.
204+ Alterar a estratégia é um ** breaking change** e deve ser tratado como refactor.
188205
189206### ` full ` (default)
190207
191208``` php
192209Tbl::users
193210Tbl::users__id
194- Tbl::fk__users__posts
211+ Tbl::on__posts__users
195212```
196213
197- # ## `short`
214+ ### ` short `
198215
199216``` php
200- Tbl::users
217+ Tbl::usr
201218Tbl::usr__id
202- Tbl::fk__users__posts
203- ` ` `
204-
205- # ## `abbr`
206-
207- ` ` ` php
208- Tbl::users // users
209- Tbl::usr__id // users_id
210- Tbl::fk__usr_pst // users_posts
219+ Tbl::on__pst__usr
211220```
212- >
213221
214- # ## `alias `
222+ ### ` abbr `
215223
216224``` php
217- Tbl::users // users
218- Tbl::u__id // users_id
219- Tbl::fk__u__p // users_posts
225+ Tbl::u
226+ Tbl::u__id
227+ Tbl::on__p__u
220228```
221229
222230---
@@ -228,7 +236,7 @@ Cada geração inclui metadados:
228236``` php
229237/**
230238 * @schema-hash md5:abc123...
231- * @generated 2026-01-08 18:42 :00
239+ * @generated 2026-01-25 21:10 :00
232240 */
233241```
234242
@@ -243,7 +251,7 @@ Se o hash mudar, o schema foi alterado.
243251``` json
244252{
245253 "autoload" : {
246- "files": ["Tbl.php"]
254+ "files" : [" path/to/ Tbl.php" ]
247255 }
248256}
249257```
@@ -254,7 +262,7 @@ Se o hash mudar, o schema foi alterado.
254262{
255263 "autoload" : {
256264 "psr-4" : {
257- "App \\ Database \\ ": "src/Database /"
265+ "Tbl \\ " : " path/to/Tbl /"
258266 }
259267 }
260268}
@@ -266,37 +274,17 @@ composer dump-autoload
266274
267275---
268276
269- # # 📝 Exemplo de Utilização
270-
271- ` ` ` php
272- $sql = "
273- SELECT *
274- FROM " . Tbl::users . "
275- WHERE " . Tbl::users_id . " = ?
276- ";
277-
278- $status = Tbl::enum__users__active;
279- $fk = Tbl::fk__posts__users;
280- $alias = Tbl::as__users;
281- ` ` `
282-
283- ---
284-
285277## 🐛 Resolução de Problemas
286278
287- **Nenhuma tabela encontrada**
288-
289- * Verifique a base de dados configurada
290- * Confirme que existem tabelas
279+ ** JOIN não gerado**
291280
292- **Erro de ligação**
281+ * Verifique se existe foreign key real no schema
282+ * Reexecute o gerador após alterações
293283
294- * Credenciais incorrectas no `tblclass.yaml`
295- * Serviço da base de dados inactivo
296-
297- **Schema alterado**
284+ ** Nenhuma tabela encontrada**
298285
299- * Reexecutar `tbl-class`
286+ * Confirme a base de dados configurada
287+ * Verifique permissões
300288
301289---
302290
@@ -309,7 +297,7 @@ MIT License — Eril TS Carvalho
309297## 🤝 Contribuições
310298
311299Issues e pull requests são bem-vindos.
312- Sugestões técnicas são apreciadas .
300+ Discussões técnicas são incentivadas .
313301
314302---
315303
0 commit comments