Generate annotated doctrine2 from db schema

Is it possible to generate Doctrine 2 objects with corresponding docblock annotations from an existing database schema?

+6
annotations schema doctrine2 docblocks
source share
4 answers

I had to make these changes for the above code to work.

<?php use Doctrine\ORM\Tools\EntityGenerator; ini_set("display_errors", "On"); $libPath = __DIR__; // Set this to where you have doctrine2 installed // autoloaders require_once $libPath . '/Doctrine/Common/ClassLoader.php'; $classLoader = new \Doctrine\Common\ClassLoader('Doctrine', $libPath); $classLoader->register(); $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( 'path' => 'test.sqlite3', 'driver' => 'pdo_sqlite', ); $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 EntityGenerator(); $generator->setUpdateEntityIfExists(true); $generator->setGenerateStubMethods(true); $generator->setGenerateAnnotations(true); $generator->generate($metadata, __DIR__ . '/Entities'); print 'Done!'; ?> 

and mysql connection configuration, for example:

 $connectionParams = array( 'driver' => 'pdo_mysql', 'host' => 'localhost', 'port' => '3306', 'user' => 'root', 'password' => 'root', 'dbname' => 'database', 'charset' => 'utf8', ); 
+8
source share

Yes, it is possible, although RDBMS data types are not fully supported, so you may have to play around with the code a bit before using it in your project. It's not straightforward, like Doctrine 1.x, but still pretty easy. Here is an example of the code that I used myself (correctly create folders before using it)

  use Doctrine \ ORM \ Tools \ EntityGenerator;

 ini_set ("display_errors", "On");

 $ libPath = __DIR__.  '/../lib/doctrine2';

 // autoloaders
 require_once $ libPath.  '/Doctrine/Common/ClassLoader.php';

 $ classLoader = new \ Doctrine \ Common \ ClassLoader ('Doctrine', $ libPath);
 $ classLoader-> register ();

 $ 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 (
     'dbname' => 'xx',
     'user' => 'root',
     'password' => '',
     'host' => 'localhost',
     'driver' => 'pdo_mysql',
 );

 $ 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 ()
 );
 $ classes = $ driver-> getAllClassNames ();
 foreach ($ classes as $ class) {
     // any unsupported table / schema could be handled here to exclude some classes
     if (true) {
         $ metadata [] = $ cmf-> getMetadataFor ($ class);
     }
 }

 $ em-> getConfiguration () -> setMetadataDriverImpl ($ driver);
 $ cmf = new \ Doctrine \ ORM \ Tools \ DisconnectedClassMetadataFactory ($ em);

 $ generator = new EntityGenerator ();
 $ generator-> setUpdateEntityIfExists (true);
 $ generator-> setGenerateStubMethods (true);
 $ generator-> setGenerateAnnotations (true);
 $ generator-> generate ($ metadata, __DIR__. '/ Entities');

 print 'Done!';
+2
source share

I ran a new command to achieve this https://github.com/umpirsky/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesDbCommand.php

Just add it like this:

 $cli->addCommands(array( // DBAL Commands new \Doctrine\DBAL\Tools\Console\Command\RunSqlCommand(), new \Doctrine\DBAL\Tools\Console\Command\ImportCommand(), // ORM Commands new \Doctrine\ORM\Tools\Console\Command\ClearCache\MetadataCommand(), new \Doctrine\ORM\Tools\Console\Command\ClearCache\ResultCommand(), new \Doctrine\ORM\Tools\Console\Command\ClearCache\QueryCommand(), new \Doctrine\ORM\Tools\Console\Command\SchemaTool\CreateCommand(), new \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand(), new \Doctrine\ORM\Tools\Console\Command\SchemaTool\DropCommand(), new \Doctrine\ORM\Tools\Console\Command\EnsureProductionSettingsCommand(), new \Doctrine\ORM\Tools\Console\Command\ConvertDoctrine1SchemaCommand(), new \Doctrine\ORM\Tools\Console\Command\GenerateRepositoriesCommand(), new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesCommand(), new \Doctrine\ORM\Tools\Console\Command\GenerateEntitiesDbCommand(), new \Doctrine\ORM\Tools\Console\Command\GenerateProxiesCommand(), new \Doctrine\ORM\Tools\Console\Command\ConvertMappingCommand(), new \Doctrine\ORM\Tools\Console\Command\RunDqlCommand(), new \Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand(), 

)); $ CLI-> Run ();

0
source share

Starting at https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/ConsoleRunner.php , generating objects are already supported by the Doctrine CLI by default

0
source share

All Articles