2010-10-31 17 views
6

Mevcut bir veritabanı şemasından, Doküman 2 varlıkları ilgili doküman bloğu ek açıklamaları ile oluşturulabilir mi?db şemadan açıklamalı doctrine2 girişleri oluştur

+0

Bunu yapmayın. Özellikle uygulamanız için bunları sıfırdan oluşturursanız daha iyi varlıklar oluşturabilirsiniz. Daha sonra ek açıklamalarla eşleyin. – rojoca

cevap

8

işe yukarıdaki kodu için bu değişiklikleri yaptıktan zorunda kaldı ..

<?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!'; 
?> 

ve mysql bağlantısı konfigürasyonu gibi:

https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/ConsoleRunner.php itibariyle
$connectionParams = array(
    'driver' => 'pdo_mysql', 
    'host' => 'localhost', 
    'port' => '3306', 
    'user' => 'root', 
    'password' => 'root', 
    'dbname' => 'database', 
    'charset' => 'utf8', 
); 
+0

Teşekkürler! Bu aslında işe yaradı. (Doktora dahil programa benzemez). - Sadece kodunuzu '$ connectionParams' altından kullanmış olmama rağmen, ortam ayarlarınızdan emin değilim. Örneğin, 'register();' işlevi açıkça tanımlanmamıştır. Zaten büyük +1! – vbence

+0

Bu benim için iyi çalışıyor ... Senin için büyük bir +1. Aynı problemi olan başkaları için lütfen bu cevabı kullanın, diğerleri işe yaramayacaktır ... – Tareq

+0

@dminer: Scriptiniz başarılı ve doctrine yeni bie olduğum için çok zaman harcadım. Bu betik, CRUD işlemleri hariç olmak üzere setter ve getter yöntemiyle veritabanından varlık yarattı. Bir sonraki temel CRUD işlemini o varlıkta eklemek isterim. Projemin bir senfoni projesi değil, basit bir çekirdek proje olduğunu lütfen unutmayın. – neeraj

2

Evet, ancak RDBMS veri türleri tam olarak desteklenmiyor olsa da, projenizde kullanmadan önce kodunuzla biraz oynamanız gerekebilir. Doctrine 1.x'in eskiden olduğu gibi değil, daha da kolay. Aşağıda bir örnek kod ben https://github.com/umpirsky/doctrine2/blob/master/lib/Doctrine/ORM/Tools/Console/Command/GenerateEntitiesDbCommand.php

Bunun gibi ekleyin Bunu başarmak için yeni komut uygulamış

 
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!'; 
+0

$ metadata [] = $ cmf-> getMetadataFor ($ class) satırında başarısız; Neden henüz var olmayan bir sınıfın ebeveyni almaya çalışır? Yani, bunlar tersine mühendisliğe gidecek olan Varlıkların isimleridir. – DaTroop

+0

Bu çalışmıyor ... – Tareq

0

(kullanmadan önce düzgün klasörler oluşturabilirsiniz) kendim kullandı:

$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

, varlıklar üretme zaten öğretinin varsayılan olarak desteklenmektedir CLI