Skip to content

Instantly share code, notes, and snippets.

@tawfekov
Last active March 2, 2024 16:06
Show Gist options
  • Star 75 You must be signed in to star a gist
  • Fork 33 You must be signed in to fork a gist
  • Save tawfekov/4079388 to your computer and use it in GitHub Desktop.
Save tawfekov/4079388 to your computer and use it in GitHub Desktop.
Doctrine2 Generate Entities form Existing Database
<?php
include '../vendor/autoload.php';
$classLoader = new \Doctrine\Common\ClassLoader('Entities', __DIR__);
$classLoader->register();
$classLoader = new \Doctrine\Common\ClassLoader('Proxies', __DIR__);
$classLoader->register();
// config
$config = new \Doctrine\ORM\Configuration();
$config->setMetadataDriverImpl($config->newDefaultAnnotationDriver(__DIR__ . '/Entities'));
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
$config->setProxyDir(__DIR__ . '/Proxies');
$config->setProxyNamespace('Proxies');
$connectionParams = array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'port' => '3306',
'user' => 'root',
'password' => 'root',
'dbname' => 'dbname',
'charset' => 'utf8',
);
$em = \Doctrine\ORM\EntityManager::create($connectionParams, $config);
// custom datatypes (not mapped for reverse engineering)
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('set', 'string');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
// fetch metadata
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
);
$em->getConfiguration()->setMetadataDriverImpl($driver);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory($em);
$cmf->setEntityManager($em);
$classes = $driver->getAllClassNames();
$metadata = $cmf->getAllMetadata();
$generator = new Doctrine\ORM\Tools\EntityGenerator();
$generator->setUpdateEntityIfExists(true);
$generator->setGenerateStubMethods(true);
$generator->setGenerateAnnotations(true);
$generator->generate($metadata, __DIR__ . '/Entities');
print 'Done!';
@MaximeC64
Copy link

Hello dwgebler,
I search a system to import a existing database for a while so thanks for your job.
But i'm a beginner and i don't know where i have to put this .php file ?
Somebody can help me please ?

Thanks.
Sorry for my english, i'm french.

@MP92
Copy link

MP92 commented Apr 27, 2018

Thanks man, very cool tool!

Specific tables entity generation (not all tables, only specified):

// fetch metadata
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
    $em->getConnection()->getSchemaManager()
);

$specificTables = [
    $em->getConnection()->getSchemaManager()->listTableDetails('table_one'),
    $em->getConnection()->getSchemaManager()->listTableDetails('table_two')
];

$driver->setTables($specificTables, []);

$em->getConfiguration()->setMetadataDriverImpl($driver);

@aruponse
Copy link

aruponse commented May 7, 2018

Thanks, this help a lot, and really really thanks to @MP92 you actually save my day.

@yourchoice
Copy link

Fatal error: Uncaught Doctrine\ORM\Mapping\MappingException: Table _article_recipe has no primary key. Doctrine does not support reverse engineering from tables that don't have a primary key. in E:_test\doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\Driver\DatabaseDriver.php:288

@nitheeshunnikrishnan
Copy link

awesome,
you save the day
👍

@catsAND
Copy link

catsAND commented Nov 26, 2018

Thanks. 👍

@HazemNoor
Copy link

Thank you

@VickaB
Copy link

VickaB commented Apr 13, 2020

Thank you!

@janbarasek
Copy link

I implement it to Symfony command and Doctrine Composer package here: https://github.com/baraja-core/doctrine/blob/master/src/Orm/DatabaseToDoctrineEntityExtractorCommand.php

@tawfekov
Copy link
Author

tawfekov commented Dec 4, 2020

@janbarasek Thank you for your improvements

@michealzh
Copy link

@janbarasek Thanks for sharing.It's awesome for my project.

@linuxd3v
Copy link

linuxd3v commented Oct 25, 2021

Its interesting that code generation got deprecated and to be removed in version 3.
Via EntityGenerator as in example above or through cli.
I wonder how would one get started with preexisting databases then (after v3 is stable)? probably just writing from scratch which seems pita.

see notes here: https://github.com/doctrine/orm/blob/3.0.x/UPGRADE.md

Deprecated code generators and related console commands
These console commands have been deprecated:
orm:convert-mapping
orm:generate:entities
orm:generate-repositories
These classes have been deprecated:
Doctrine\ORM\Tools\EntityGenerator
Doctrine\ORM\Tools\EntityRepositoryGenerator
Whole Doctrine\ORM\Tools\Export namespace with all its members have been deprecated as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment