dimoussa/doctrine-db-mapper-bundle
A Symfony bundle to automatically generate Doctrine entities from a MySQL database with full relationship support (OneToMany, ManyToOne, ManyToMany).
composer require dimoussa/doctrine-db-mapper-bundle
Configure your MySQL connection in .env:
DATABASE_URL="mysql://user:password@localhost:3306/my_database"
php bin/console dbmapper:generate-entities src/Entity
php bin/console dbmapper:generate-entities src/Entity --table=users
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.
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
📊 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.).
php bin/console dbmapper:modify-entities
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.
AUTO_INCREMENT detection (no forced changes on non-auto-increment PKs)add/remove methods for collectionsuse statements)MIT
Diallo Moussa
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).
composer require dimoussa/doctrine-db-mapper-bundle
Configurez votre connexion MySQL dans .env :
DATABASE_URL="mysql://user:password@localhost:3306/ma_base"
php bin/console dbmapper:generate-entities src/Entity
php bin/console dbmapper:generate-entities src/Entity --table=users
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.
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
📊 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.).
php bin/console dbmapper:modify-entities
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é.
AUTO_INCREMENT (pas de modification forcée sur les PK non auto-incrémentées)add/remove pour les collectionsuse statements)MIT
Diallo Moussa
How can I help you explore Laravel packages today?