dimoussa / doctrine-db-mapper-bundle
Bundle Symfony pour générer automatiquement des entités Doctrine depuis une base de données MySQL avec support complet des relations (OneToMany, ManyToOne, ManyToMany)
Package info
github.com/DImoussa/doctrine-db-mapper-bundle
Type:symfony-bundle
pkg:composer/dimoussa/doctrine-db-mapper-bundle
Requires
- php: >=8.1
- doctrine/dbal: ^3.0|^4.0
- doctrine/orm: ^2.14|^3.0
- symfony/config: ^6.0|^7.0
- symfony/console: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
- symfony/process: ^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^9.5|^10.0
README
English
A Symfony bundle to automatically generate Doctrine entities from a MySQL database with full relationship support (OneToMany, ManyToOne, ManyToMany).
📦 Installation
composer require dimoussa/doctrine-db-mapper-bundle
⚙️ Configuration
Configure your MySQL connection in .env:
DATABASE_URL="mysql://user:password@localhost:3306/my_database"
🚀 Usage
Generate all entities
php bin/console dbmapper:generate-entities src/Entity
Generate a specific table
php bin/console dbmapper:generate-entities src/Entity --table=users
Preview pending schema diff (optional safety step before generation)
php bin/console dbmapper:generate-entities src/Entity --schema-preview
This shows the SQL Doctrine would run to align the database before entities are regenerated.
Regenerate without losing your custom code
When an entity file already exists, the bundle automatically merges the generated code with your existing file. Custom methods, non-ORM properties, interfaces, traits, and use statements are preserved.
# Regenerate all entities while preserving custom code php bin/console dbmapper:generate-entities src/Entity --merge # Regenerate a specific table only while preserving custom code php bin/console dbmapper:generate-entities src/Entity --merge --table=users
📋 Output example
📊 Analyzing the database schema...
🔗 Analyzing relationships between tables...
→ ManyToMany association tables detected: user_roles, post_tags
⚙️ Generating entities and repositories...
⏭️ System table ignored: messenger_messages (configured in ignored_tables)
⏭️ Association table ignored: user_roles (handled as ManyToMany)
✅ User.php generated [2 OneToMany] [1 ManyToMany]
✅ Post.php generated [1 OneToMany] [1 ManyToMany]
✅ Comment.php generated
🧹 Clearing Symfony cache...
✅ Symfony cache cleared.
🔄 Synchronizing database with generated mapping...
✅ Database synchronized with Doctrine mapping.
✨ Generation completed successfully!
The bundle automatically synchronizes the database after generation to resolve cosmetic differences (index naming,
text→longtext, etc.).
Manage the database (modify, view the schema...)
php bin/console dbmapper:modify-entities
Interactive mode example
The dbmapper:modify-entities command launches a fully interactive menu to manage your database schema:
[DbMapper] Interactive schema modification mode
What do you want to do?
[0] List tables
[1] Choose a table to modify
[2] Show current change plan
[3] Preview SQL to be executed
[4] Apply changes to the database
[5] Quit
> 1
Choose a table to modify:
[0] users
[1] posts
[2] comments
> 0
Selected table: users
What do you want to do?
[0] View attributes (columns)
[1] Add a new attribute
[2] Manage relations
[3] Back to main menu
> 0
Columns of the table users:
- id (integer), nullable: NO
- username (string), nullable: NO
- email (string), nullable: NO
- created_at (datetime), nullable: YES
Selected table: users
What do you want to do?
[0] View attributes (columns)
[1] Add a new attribute
[2] Manage relations
[3] Back to main menu
> 1
New attribute (column) name: avatar
Doctrine type (e.g.: string, integer, text, boolean, datetime, float, decimal): string
Can this attribute be NULL?
[0] no
[1] yes
> 1
New column summary:
- Table : users
- Name : avatar
- Type : string
- NULL : yes
Confirm adding this column to the change plan?
[0] no
[1] yes
> 1
Column added to the change plan (no actual changes made yet).
What do you want to do?
[0] List tables
[1] Choose a table to modify
[2] Show current change plan
[3] Preview SQL to be executed
[4] Apply changes to the database
[5] Quit
> 3
SQL queries to be executed:
ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL;
> 4
Change plan:
- [ADD COLUMN] Table users : avatar (string), nullable: yes
SQL queries to be executed:
ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL;
Are you sure you want to apply these changes to the database?
[0] no
[1] yes
> 1
Applying changes...
✓ All changes have been applied successfully!
✓ ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL
The change plan has been cleared.
✨ What the bundle generates
- ✅ Doctrine entities with correct PHP types
- ✅ Automatic relationships (OneToMany, ManyToOne, ManyToMany)
- ✅ Smart
AUTO_INCREMENTdetection (no forced changes on non-auto-increment PKs) - ✅ Correct ManyToMany composite PK ordering (matches the real database)
- ✅ Getters and setters
- ✅
add/removemethods for collections - ✅ Repositories
- ✅ Smart entity merging on regeneration (preserves custom methods, non-ORM properties, interfaces, traits, and
usestatements) - ✅ Automatic post-generation database synchronization (handles index renaming, type adjustments, and composite PK changes with FK constraints)
📝 Requirements
- PHP >= 8.1
- Symfony ^6.0 | ^7.0
- Doctrine ORM ^2.14 | ^3.0
- MySQL/MariaDB database
📄 License
MIT
👤 Author
Diallo Moussa
- Email: moussadou128@gmail.com
- GitHub: @DImoussa
Français
Bundle Symfony pour générer automatiquement des entités Doctrine depuis une base de données MySQL avec support complet des relations (OneToMany, ManyToOne, ManyToMany).
📦 Installation
composer require dimoussa/doctrine-db-mapper-bundle
⚙️ Configuration
Configurez votre connexion MySQL dans .env :
DATABASE_URL="mysql://user:password@localhost:3306/ma_base"
🚀 Utilisation
Générer toutes les entités
php bin/console dbmapper:generate-entities src/Entity
Générer une table spécifique
php bin/console dbmapper:generate-entities src/Entity --table=users
Prévisualiser le diff SQL (optionnel avant la génération)
php bin/console dbmapper:generate-entities src/Entity --schema-preview
Affiche les requêtes SQL que Doctrine exécuterait pour synchroniser la base avant la régénération des entités.
Régénérer sans perdre votre code custom
Lorsqu'un fichier d'entité existe déjà, le bundle fusionne automatiquement le code généré avec le fichier existant. Les méthodes custom, les propriétés non-ORM, les interfaces, les traits et les use statements sont préservés.
# Régénérer toutes les entités en préservant le code custom php bin/console dbmapper:generate-entities src/Entity --merge # Régénérer une table spécifique uniquement en préservant le code custom php bin/console dbmapper:generate-entities src/Entity --merge --table=users
📋 Exemple de sortie
📊 Analyse du schéma de la base de données...
🔗 Analyse des relations entre tables...
→ Tables d'association ManyToMany détectées: user_roles, post_tags
⚙️ Génération des entités et repositories...
⏭️ Table système ignorée: messenger_messages (configurée dans ignored_tables)
⏭️ Table d'association ignorée: user_roles (gérée comme ManyToMany)
✅ User.php généré [2 OneToMany] [1 ManyToMany]
✅ Post.php généré [1 OneToMany] [1 ManyToMany]
✅ Comment.php généré
🧹 Nettoyage du cache Symfony...
✅ Cache Symfony nettoyé avec succès.
🔄 Synchronisation de la base de données avec le mapping généré...
✅ Base de données synchronisée avec le mapping Doctrine.
✨ Génération terminée avec succès !
Le bundle synchronise automatiquement la base après génération pour résoudre les différences cosmétiques (nommage d'index,
text→longtext, etc.).
Gérer la base de donnée (modification, visualisation de la base...)
php bin/console dbmapper:modify-entities
Exemple du mode interactif
La commande dbmapper:modify-entities lance un menu entièrement interactif pour gérer le schéma de votre base de données :
[DbMapper] Mode interactif de modification du schéma
Que veux-tu faire ?
[0] Lister les tables
[1] Choisir une table à modifier
[2] Afficher le plan des changements en cours
[3] Prévisualiser le SQL qui sera exécuté
[4] Appliquer les changements dans la base de données
[5] Quitter
> 1
Choisis une table à modifier :
[0] users
[1] posts
[2] comments
> 0
Table sélectionnée : users
Que veux-tu faire ?
[0] Voir les attributs (colonnes)
[1] Ajouter un nouvel attribut
[2] Gérer les relations
[3] Revenir au menu principal
> 0
Colonnes de la table users :
- id (integer), nullable: NO
- username (string), nullable: NO
- email (string), nullable: NO
- created_at (datetime), nullable: YES
Table sélectionnée : users
Que veux-tu faire ?
[0] Voir les attributs (colonnes)
[1] Ajouter un nouvel attribut
[2] Gérer les relations
[3] Revenir au menu principal
> 1
Nom du nouvel attribut (colonne) : avatar
Type Doctrine du nouvel attribut (ex: string, integer, text, boolean, datetime, float, decimal) : string
Ce nouvel attribut peut-il être NULL ?
[0] non
[1] oui
> 1
Récapitulatif de la nouvelle colonne :
- Table : users
- Nom : avatar
- Type : string
- NULL : oui
Confirmer l'ajout de cette colonne au plan de changements ?
[0] non
[1] oui
> 1
Colonne ajoutée au plan de changements (aucune modification réelle effectuée pour l'instant).
Que veux-tu faire ?
[0] Lister les tables
[1] Choisir une table à modifier
[2] Afficher le plan des changements en cours
[3] Prévisualiser le SQL qui sera exécuté
[4] Appliquer les changements dans la base de données
[5] Quitter
> 3
Requêtes SQL qui seront exécutées :
ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL;
> 4
Plan de changements :
- [ADD COLUMN] Table users : avatar (string), nullable: oui
Requêtes SQL qui seront exécutées :
ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL;
Êtes-vous sûr de vouloir appliquer ces changements dans la base de données ?
[0] non
[1] oui
> 1
Application des changements...
✓ Tous les changements ont été appliqués avec succès !
✓ ALTER TABLE users ADD avatar VARCHAR(255) DEFAULT NULL
Le plan de changements a été vidé.
✨ Ce que le bundle génère
- ✅ Entités Doctrine avec types PHP corrects
- ✅ Relations automatiques (OneToMany, ManyToOne, ManyToMany)
- ✅ Détection intelligente de l'
AUTO_INCREMENT(pas de modification forcée sur les PK non auto-incrémentées) - ✅ Ordre correct des PK composites ManyToMany (correspond à la base réelle)
- ✅ Getters et setters
- ✅ Méthodes
add/removepour les collections - ✅ Repositories
- ✅ Fusion intelligente des entités lors d'une régénération (préserve les méthodes custom, les propriétés non-ORM, les interfaces, les traits et les
usestatements) - ✅ Synchronisation automatique post-génération (gère le renommage d'index, les ajustements de types et les changements de PK composites avec contraintes FK)
📝 Prérequis
- PHP >= 8.1
- Symfony ^6.0 | ^7.0
- Doctrine ORM ^2.14 | ^3.0
- Base de données MySQL/MariaDB
📄 Licence
MIT
👤 Auteur
Diallo Moussa
- Email: moussadou128@gmail.com
- GitHub: @DImoussa