Hallo iedereen,
Wij hebben besloten om ORM toe te gaan passen binnen onze applicatie en hier gebruik van Doctrine 2 voor te maken. Laatse dagen ben ik flink in de studie gegaan over Doctrine 2 en vind het sowieso een erg gaaf project met veel mogelijkheden. Echter is het best een bittere pil om het onder de knie te krijgen door vele lagen die erin zitten.
Entities zijn volgens mij je models en de 'PHP' vertaling in objecten van je database. Echter zie ik bij Doctrine 2 ook Proxies, Mappings, etc. Nu probeer ik grip te krijgen op wat die termen allemaal precies betekenen en wat je ermee kunt. Misschien kan iemand mij een beetje opweg helpen met deze termen door dit in jip-en-janneke taal uit te leggen of me te verwijzen naar een goed artikel erover?
Ondertussen ben ik ermee aan het spelen en wil ik entities genereren van onze bestaande database. Dit kan vrij eenvoudig menen zijn met de commandline tool van Doctrine 2. Hier heb ik een script voor gevonden en aangepast:
En bij het uitvoeren van dit script lijkt hij het wel te gaan doen totdat ik een MappingException krijg met de melding: Property "customerid" in "Order" was already declared, but it must be declared only once.
Ik heb een tabel customer:
customerid
name
place
postalcode
etc
Tabel order:
orderid
customerid => foreign key naar customer
insertdate
Nu DENK ik dat Doctrine het niet leuk vind dat ik 2 tabellen een veld 'customerid' hebben. Als dit zo is zou dat best rampzalig zijn want zo werk ik in 80 tabellen
Wat is nu de beste optie? Moet ik al mijn entities zelf schrijven? Of kun je Doctrine op een of andere manier zo configureren dat het wel werkt?
Ik ben benieuwd!
Wij hebben besloten om ORM toe te gaan passen binnen onze applicatie en hier gebruik van Doctrine 2 voor te maken. Laatse dagen ben ik flink in de studie gegaan over Doctrine 2 en vind het sowieso een erg gaaf project met veel mogelijkheden. Echter is het best een bittere pil om het onder de knie te krijgen door vele lagen die erin zitten.
Entities zijn volgens mij je models en de 'PHP' vertaling in objecten van je database. Echter zie ik bij Doctrine 2 ook Proxies, Mappings, etc. Nu probeer ik grip te krijgen op wat die termen allemaal precies betekenen en wat je ermee kunt. Misschien kan iemand mij een beetje opweg helpen met deze termen door dit in jip-en-janneke taal uit te leggen of me te verwijzen naar een goed artikel erover?
Ondertussen ben ik ermee aan het spelen en wil ik entities genereren van onze bestaande database. Dit kan vrij eenvoudig menen zijn met de commandline tool van Doctrine 2. Hier heb ik een script voor gevonden en aangepast:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| <?php set_include_path(get_include_path() . ':' . '/var/www/xxxxx/library/'); use Doctrine\ORM\Tools\EntityGenerator; ini_set("display_errors", "On"); // this is not necessary if you use Doctrine2 with PEAR //$libPath = __DIR__ . '/../lib/doctrine2'; // autoloaders require_once 'Doctrine/Common/ClassLoader.php'; //$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', $libPath); // custom path $classLoader = new \Doctrine\Common\ClassLoader('Doctrine'); // with PEAR $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' => 'xxxxx', 'user' => 'xxxx', 'password' => 'xxxx', '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'); $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('bit', 'integer'); $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('mediumblob', 'string'); $em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('tinyblob', 'string'); // fetch metadata $driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver( $em->getConnection()->getSchemaManager() ); $em->getConfiguration()->setMetadataDriverImpl($driver); $cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory(); $cmf->setEntityManager($em); // we must set the EntityManager $classes = $driver->getAllClassNames(); $metadata = array(); foreach ($classes as $class) { //any unsupported table/schema could be handled here to exclude some classes if (true) { $metadata[] = $cmf->getMetadataFor($class); } } $generator = new EntityGenerator(); $generator->setUpdateEntityIfExists(true); // only update if class already exists //$generator->setRegenerateEntityIfExists(true); // this will overwrite the existing classes $generator->setGenerateStubMethods(true); $generator->setGenerateAnnotations(true); $generator->generate($metadata, __DIR__ . '/Entities'); print 'Done!'; |
En bij het uitvoeren van dit script lijkt hij het wel te gaan doen totdat ik een MappingException krijg met de melding: Property "customerid" in "Order" was already declared, but it must be declared only once.
Ik heb een tabel customer:
customerid
name
place
postalcode
etc
Tabel order:
orderid
customerid => foreign key naar customer
insertdate
Nu DENK ik dat Doctrine het niet leuk vind dat ik 2 tabellen een veld 'customerid' hebben. Als dit zo is zou dat best rampzalig zijn want zo werk ik in 80 tabellen
Wat is nu de beste optie? Moet ik al mijn entities zelf schrijven? Of kun je Doctrine op een of andere manier zo configureren dat het wel werkt?
Ik ben benieuwd!