3 namespace Doctrine\Tests\ORM\Mapping;
5 use Doctrine\ORM\Mapping\ClassMetadata,
6 Doctrine\ORM\Mapping\ClassMetadataInfo,
7 Doctrine\ORM\Mapping\Driver\XmlDriver,
8 Doctrine\ORM\Mapping\Driver\YamlDriver;
10 require_once __DIR__ . '/../../TestInit.php';
12 abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase
14 abstract protected function _loadDriver();
16 public function createClassMetadata($entityClassName)
18 $mappingDriver = $this->_loadDriver();
20 $class = new ClassMetadata($entityClassName);
21 $class->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
22 $mappingDriver->loadMetadataForClass($entityClassName, $class);
28 * @param \Doctrine\ORM\EntityManager $entityClassName
29 * @return \Doctrine\ORM\Mapping\ClassMetadataFactory
31 protected function createClassMetadataFactory(\Doctrine\ORM\EntityManager $em = null)
33 $driver = $this->_loadDriver();
34 $em = $em ?: $this->_getTestEntityManager();
35 $factory = new \Doctrine\ORM\Mapping\ClassMetadataFactory();
36 $em->getConfiguration()->setMetadataDriverImpl($driver);
37 $factory->setEntityManager($em);
42 public function testLoadMapping()
44 $entityClassName = 'Doctrine\Tests\ORM\Mapping\User';
45 return $this->createClassMetadata($entityClassName);
49 * @depends testLoadMapping
50 * @param ClassMetadata $class
52 public function testEntityTableNameAndInheritance($class)
54 $this->assertEquals('cms_users', $class->getTableName());
55 $this->assertEquals(ClassMetadata::INHERITANCE_TYPE_NONE, $class->inheritanceType);
61 * @depends testEntityTableNameAndInheritance
62 * @param ClassMetadata $class
64 public function testEntityIndexes($class)
66 $this->assertArrayHasKey('indexes', $class->table, 'ClassMetadata should have indexes key in table property.');
67 $this->assertEquals(array(
68 'name_idx' => array('columns' => array('name')),
69 0 => array('columns' => array('user_email'))
70 ), $class->table['indexes']);
76 * @depends testEntityTableNameAndInheritance
77 * @param ClassMetadata $class
79 public function testEntityUniqueConstraints($class)
81 $this->assertArrayHasKey('uniqueConstraints', $class->table,
82 'ClassMetadata should have uniqueConstraints key in table property when Unique Constraints are set.');
84 $this->assertEquals(array(
85 "search_idx" => array("columns" => array("name", "user_email"))
86 ), $class->table['uniqueConstraints']);
92 * @depends testEntityTableNameAndInheritance
93 * @param ClassMetadata $class
95 public function testEntityOptions($class)
97 $this->assertArrayHasKey('options', $class->table, 'ClassMetadata should have options key in table property.');
99 $this->assertEquals(array(
100 'foo' => 'bar', 'baz' => array('key' => 'val')
101 ), $class->table['options']);
107 * @depends testEntityOptions
108 * @param ClassMetadata $class
110 public function testEntitySequence($class)
112 $this->assertInternalType('array', $class->sequenceGeneratorDefinition, 'No Sequence Definition set on this driver.');
115 'sequenceName' => 'tablename_seq',
116 'allocationSize' => 100,
119 $class->sequenceGeneratorDefinition
123 public function testEntityCustomGenerator()
125 $class = $this->createClassMetadata('Doctrine\Tests\ORM\Mapping\Animal');
127 $this->assertEquals(ClassMetadata::GENERATOR_TYPE_CUSTOM,
128 $class->generatorType, "Generator Type");
130 array("class" => "stdClass"),
131 $class->customGeneratorDefinition,
132 "Custom Generator Definition");
137 * @depends testEntityTableNameAndInheritance
138 * @param ClassMetadata $class
140 public function testFieldMappings($class)
142 $this->assertEquals(3, count($class->fieldMappings));
143 $this->assertTrue(isset($class->fieldMappings['id']));
144 $this->assertTrue(isset($class->fieldMappings['name']));
145 $this->assertTrue(isset($class->fieldMappings['email']));
151 * @depends testEntityTableNameAndInheritance
152 * @param ClassMetadata $class
154 public function testFieldMappingsColumnNames($class)
156 $this->assertEquals("id", $class->fieldMappings['id']['columnName']);
157 $this->assertEquals("name", $class->fieldMappings['name']['columnName']);
158 $this->assertEquals("user_email", $class->fieldMappings['email']['columnName']);
164 * @depends testEntityTableNameAndInheritance
165 * @param ClassMetadata $class
167 public function testStringFieldMappings($class)
169 $this->assertEquals('string', $class->fieldMappings['name']['type']);
170 $this->assertEquals(50, $class->fieldMappings['name']['length']);
171 $this->assertTrue($class->fieldMappings['name']['nullable']);
172 $this->assertTrue($class->fieldMappings['name']['unique']);
174 $expected = array('foo' => 'bar', 'baz' => array('key' => 'val'));
175 $this->assertEquals($expected, $class->fieldMappings['name']['options']);
181 * @depends testFieldMappings
182 * @param ClassMetadata $class
184 public function testIdentifier($class)
186 $this->assertEquals(array('id'), $class->identifier);
187 $this->assertEquals('integer', $class->fieldMappings['id']['type']);
188 $this->assertEquals(ClassMetadata::GENERATOR_TYPE_AUTO, $class->generatorType, "ID-Generator is not ClassMetadata::GENERATOR_TYPE_AUTO");
194 * @depends testIdentifier
195 * @param ClassMetadata $class
197 public function testAssocations($class)
199 $this->assertEquals(3, count($class->associationMappings));
205 * @depends testAssocations
206 * @param ClassMetadata $class
208 public function testOwningOneToOneAssocation($class)
210 $this->assertTrue(isset($class->associationMappings['address']));
211 $this->assertTrue($class->associationMappings['address']['isOwningSide']);
212 $this->assertEquals('user', $class->associationMappings['address']['inversedBy']);
214 $this->assertTrue($class->associationMappings['address']['isCascadeRemove']);
215 $this->assertFalse($class->associationMappings['address']['isCascadePersist']);
216 $this->assertFalse($class->associationMappings['address']['isCascadeRefresh']);
217 $this->assertFalse($class->associationMappings['address']['isCascadeDetach']);
218 $this->assertFalse($class->associationMappings['address']['isCascadeMerge']);
224 * @depends testOwningOneToOneAssocation
225 * @param ClassMetadata $class
227 public function testInverseOneToManyAssociation($class)
229 $this->assertTrue(isset($class->associationMappings['phonenumbers']));
230 $this->assertFalse($class->associationMappings['phonenumbers']['isOwningSide']);
231 $this->assertTrue($class->associationMappings['phonenumbers']['isCascadePersist']);
232 $this->assertTrue($class->associationMappings['phonenumbers']['isCascadeRemove']);
233 $this->assertFalse($class->associationMappings['phonenumbers']['isCascadeRefresh']);
234 $this->assertFalse($class->associationMappings['phonenumbers']['isCascadeDetach']);
235 $this->assertFalse($class->associationMappings['phonenumbers']['isCascadeMerge']);
236 $this->assertTrue($class->associationMappings['phonenumbers']['orphanRemoval']);
239 $this->assertEquals(array('number' => 'ASC'), $class->associationMappings['phonenumbers']['orderBy']);
245 * @depends testInverseOneToManyAssociation
246 * @param ClassMetadata $class
248 public function testManyToManyAssociationWithCascadeAll($class)
250 $this->assertTrue(isset($class->associationMappings['groups']));
251 $this->assertTrue($class->associationMappings['groups']['isOwningSide']);
252 // Make sure that cascade-all works as expected
253 $this->assertTrue($class->associationMappings['groups']['isCascadeRemove']);
254 $this->assertTrue($class->associationMappings['groups']['isCascadePersist']);
255 $this->assertTrue($class->associationMappings['groups']['isCascadeRefresh']);
256 $this->assertTrue($class->associationMappings['groups']['isCascadeDetach']);
257 $this->assertTrue($class->associationMappings['groups']['isCascadeMerge']);
259 $this->assertFalse(isset($class->associationMappings['groups']['orderBy']));
265 * @depends testManyToManyAssociationWithCascadeAll
266 * @param ClassMetadata $class
268 public function testLifecycleCallbacks($class)
270 $this->assertEquals(count($class->lifecycleCallbacks), 2);
271 $this->assertEquals($class->lifecycleCallbacks['prePersist'][0], 'doStuffOnPrePersist');
272 $this->assertEquals($class->lifecycleCallbacks['postPersist'][0], 'doStuffOnPostPersist');
278 * @depends testManyToManyAssociationWithCascadeAll
279 * @param ClassMetadata $class
281 public function testLifecycleCallbacksSupportMultipleMethodNames($class)
283 $this->assertEquals(count($class->lifecycleCallbacks['prePersist']), 2);
284 $this->assertEquals($class->lifecycleCallbacks['prePersist'][1], 'doOtherStuffOnPrePersistToo');
290 * @depends testLifecycleCallbacksSupportMultipleMethodNames
291 * @param ClassMetadata $class
293 public function testJoinColumnUniqueAndNullable($class)
295 // Non-Nullability of Join Column
296 $this->assertFalse($class->associationMappings['groups']['joinTable']['joinColumns'][0]['nullable']);
297 $this->assertFalse($class->associationMappings['groups']['joinTable']['joinColumns'][0]['unique']);
303 * @depends testJoinColumnUniqueAndNullable
304 * @param ClassMetadata $class
306 public function testColumnDefinition($class)
308 $this->assertEquals("CHAR(32) NOT NULL", $class->fieldMappings['email']['columnDefinition']);
309 $this->assertEquals("INT NULL", $class->associationMappings['groups']['joinTable']['inverseJoinColumns'][0]['columnDefinition']);
315 * @depends testColumnDefinition
316 * @param ClassMetadata $class
318 public function testJoinColumnOnDelete($class)
320 $this->assertEquals('CASCADE', $class->associationMappings['address']['joinColumns'][0]['onDelete']);
328 public function testDiscriminatorColumnDefaults()
330 if (strpos(get_class($this), 'PHPMappingDriver') !== false) {
331 $this->markTestSkipped('PHP Mapping Drivers have no defaults.');
334 $class = $this->createClassMetadata('Doctrine\Tests\ORM\Mapping\Animal');
337 array('name' => 'discr', 'type' => 'string', 'length' => '32', 'fieldName' => 'discr', 'columnDefinition' => null),
338 $class->discriminatorColumn
345 public function testMappedSuperclassWithRepository()
347 $em = $this->_getTestEntityManager();
348 $factory = $this->createClassMetadataFactory($em);
351 $class = $factory->getMetadataFor('Doctrine\Tests\Models\DDC869\DDC869CreditCardPayment');
353 $this->assertTrue(isset($class->fieldMappings['id']));
354 $this->assertTrue(isset($class->fieldMappings['value']));
355 $this->assertTrue(isset($class->fieldMappings['creditCardNumber']));
356 $this->assertEquals($class->customRepositoryClassName, "Doctrine\Tests\Models\DDC869\DDC869PaymentRepository");
357 $this->assertInstanceOf("Doctrine\Tests\Models\DDC869\DDC869PaymentRepository",
358 $em->getRepository("Doctrine\Tests\Models\DDC869\DDC869CreditCardPayment"));
359 $this->assertTrue($em->getRepository("Doctrine\Tests\Models\DDC869\DDC869ChequePayment")->isTrue());
363 $class = $factory->getMetadataFor('Doctrine\Tests\Models\DDC869\DDC869ChequePayment');
365 $this->assertTrue(isset($class->fieldMappings['id']));
366 $this->assertTrue(isset($class->fieldMappings['value']));
367 $this->assertTrue(isset($class->fieldMappings['serialNumber']));
368 $this->assertEquals($class->customRepositoryClassName, "Doctrine\Tests\Models\DDC869\DDC869PaymentRepository");
369 $this->assertInstanceOf("Doctrine\Tests\Models\DDC869\DDC869PaymentRepository",
370 $em->getRepository("Doctrine\Tests\Models\DDC869\DDC869ChequePayment"));
371 $this->assertTrue($em->getRepository("Doctrine\Tests\Models\DDC869\DDC869ChequePayment")->isTrue());
377 public function testDefaultFieldType()
379 $factory = $this->createClassMetadataFactory();
380 $class = $factory->getMetadataFor('Doctrine\Tests\Models\DDC1476\DDC1476EntityWithDefaultFieldType');
383 $this->assertArrayHasKey('id', $class->fieldMappings);
384 $this->assertArrayHasKey('name', $class->fieldMappings);
387 $this->assertArrayHasKey('type', $class->fieldMappings['id']);
388 $this->assertArrayHasKey('type', $class->fieldMappings['name']);
390 $this->assertEquals('string', $class->fieldMappings['id']['type']);
391 $this->assertEquals('string', $class->fieldMappings['name']['type']);
395 $this->assertArrayHasKey('fieldName', $class->fieldMappings['id']);
396 $this->assertArrayHasKey('fieldName', $class->fieldMappings['name']);
398 $this->assertEquals('id', $class->fieldMappings['id']['fieldName']);
399 $this->assertEquals('name', $class->fieldMappings['name']['fieldName']);
403 $this->assertArrayHasKey('columnName', $class->fieldMappings['id']);
404 $this->assertArrayHasKey('columnName', $class->fieldMappings['name']);
406 $this->assertEquals('id', $class->fieldMappings['id']['columnName']);
407 $this->assertEquals('name', $class->fieldMappings['name']['columnName']);
409 $this->assertEquals(ClassMetadataInfo::GENERATOR_TYPE_NONE, $class->generatorType);
415 public function testIdentifierColumnDefinition()
417 $class = $this->createClassMetadata(__NAMESPACE__ . '\DDC1170Entity');
420 $this->assertArrayHasKey('id', $class->fieldMappings);
421 $this->assertArrayHasKey('value', $class->fieldMappings);
423 $this->assertArrayHasKey('columnDefinition', $class->fieldMappings['id']);
424 $this->assertArrayHasKey('columnDefinition', $class->fieldMappings['value']);
426 $this->assertEquals("INT unsigned NOT NULL", $class->fieldMappings['id']['columnDefinition']);
427 $this->assertEquals("VARCHAR(255) NOT NULL", $class->fieldMappings['value']['columnDefinition']);
433 public function testNamingStrategy()
435 $em = $this->_getTestEntityManager();
436 $factory = $this->createClassMetadataFactory($em);
439 $this->assertInstanceOf('Doctrine\ORM\Mapping\DefaultNamingStrategy', $em->getConfiguration()->getNamingStrategy());
440 $em->getConfiguration()->setNamingStrategy(new \Doctrine\ORM\Mapping\UnderscoreNamingStrategy(CASE_UPPER));
441 $this->assertInstanceOf('Doctrine\ORM\Mapping\UnderscoreNamingStrategy', $em->getConfiguration()->getNamingStrategy());
443 $class = $factory->getMetadataFor('Doctrine\Tests\Models\DDC1476\DDC1476EntityWithDefaultFieldType');
445 $this->assertEquals('ID', $class->columnNames['id']);
446 $this->assertEquals('NAME', $class->columnNames['name']);
447 $this->assertEquals('DDC1476ENTITY_WITH_DEFAULT_FIELD_TYPE', $class->table['name']);
454 public function testDiscriminatorColumnDefinition()
456 $class = $this->createClassMetadata(__NAMESPACE__ . '\DDC807Entity');
458 $this->assertArrayHasKey('columnDefinition', $class->discriminatorColumn);
459 $this->assertArrayHasKey('name', $class->discriminatorColumn);
461 $this->assertEquals("ENUM('ONE','TWO')", $class->discriminatorColumn['columnDefinition']);
462 $this->assertEquals("dtype", $class->discriminatorColumn['name']);
467 * @expectedException Doctrine\ORM\Mapping\MappingException
468 * @expectedExceptionMessage Class "Doctrine\Tests\Models\DDC889\DDC889Class" sub class of "Doctrine\Tests\Models\DDC889\DDC889SuperClass" is not a valid entity or mapped super class.
470 public function testInvalidEntityOrMappedSuperClassShouldMentionParentClasses()
472 $this->createClassMetadata('Doctrine\Tests\Models\DDC889\DDC889Class');
477 * @expectedException Doctrine\ORM\Mapping\MappingException
478 * @expectedExceptionMessage No identifier/primary key specified for Entity "Doctrine\Tests\Models\DDC889\DDC889Entity" sub class of "Doctrine\Tests\Models\DDC889\DDC889SuperClass". Every Entity must have an identifier/primary key.
480 public function testIdentifierRequiredShouldMentionParentClasses()
483 $factory = $this->createClassMetadataFactory();
485 $factory->getMetadataFor('Doctrine\Tests\Models\DDC889\DDC889Entity');
488 public function testNamedQuery()
490 $driver = $this->_loadDriver();
491 $class = $this->createClassMetadata(__NAMESPACE__.'\User');
493 $this->assertCount(1, $class->getNamedQueries(), sprintf("Named queries not processed correctly by driver %s", get_class($driver)));
499 public function testNamedNativeQuery()
502 $class = $this->createClassMetadata('Doctrine\Tests\Models\CMS\CmsAddress');
505 $this->assertCount(3, $class->namedNativeQueries);
506 $this->assertArrayHasKey('find-all', $class->namedNativeQueries);
507 $this->assertArrayHasKey('find-by-id', $class->namedNativeQueries);
510 $findAllQuery = $class->getNamedNativeQuery('find-all');
511 $this->assertEquals('find-all', $findAllQuery['name']);
512 $this->assertEquals('mapping-find-all', $findAllQuery['resultSetMapping']);
513 $this->assertEquals('SELECT id, country, city FROM cms_addresses', $findAllQuery['query']);
515 $findByIdQuery = $class->getNamedNativeQuery('find-by-id');
516 $this->assertEquals('find-by-id', $findByIdQuery['name']);
517 $this->assertEquals('Doctrine\Tests\Models\CMS\CmsAddress',$findByIdQuery['resultClass']);
518 $this->assertEquals('SELECT * FROM cms_addresses WHERE id = ?', $findByIdQuery['query']);
520 $countQuery = $class->getNamedNativeQuery('count');
521 $this->assertEquals('count', $countQuery['name']);
522 $this->assertEquals('mapping-count', $countQuery['resultSetMapping']);
523 $this->assertEquals('SELECT COUNT(*) AS count FROM cms_addresses', $countQuery['query']);
525 // result set mapping
526 $this->assertCount(3, $class->sqlResultSetMappings);
527 $this->assertArrayHasKey('mapping-count', $class->sqlResultSetMappings);
528 $this->assertArrayHasKey('mapping-find-all', $class->sqlResultSetMappings);
529 $this->assertArrayHasKey('mapping-without-fields', $class->sqlResultSetMappings);
531 $findAllMapping = $class->getSqlResultSetMapping('mapping-find-all');
532 $this->assertEquals('mapping-find-all', $findAllMapping['name']);
533 $this->assertEquals('Doctrine\Tests\Models\CMS\CmsAddress', $findAllMapping['entities'][0]['entityClass']);
534 $this->assertEquals(array('name'=>'id','column'=>'id'), $findAllMapping['entities'][0]['fields'][0]);
535 $this->assertEquals(array('name'=>'city','column'=>'city'), $findAllMapping['entities'][0]['fields'][1]);
536 $this->assertEquals(array('name'=>'country','column'=>'country'), $findAllMapping['entities'][0]['fields'][2]);
538 $withoutFieldsMapping = $class->getSqlResultSetMapping('mapping-without-fields');
539 $this->assertEquals('mapping-without-fields', $withoutFieldsMapping['name']);
540 $this->assertEquals('Doctrine\Tests\Models\CMS\CmsAddress', $withoutFieldsMapping['entities'][0]['entityClass']);
541 $this->assertEquals(array(), $withoutFieldsMapping['entities'][0]['fields']);
543 $countMapping = $class->getSqlResultSetMapping('mapping-count');
544 $this->assertEquals('mapping-count', $countMapping['name']);
545 $this->assertEquals(array('name'=>'count'), $countMapping['columns'][0]);
552 public function testSqlResultSetMapping()
555 $userMetadata = $this->createClassMetadata('Doctrine\Tests\Models\CMS\CmsUser');
556 $personMetadata = $this->createClassMetadata('Doctrine\Tests\Models\Company\CompanyPerson');
559 $this->assertCount(4, $userMetadata->getSqlResultSetMappings());
561 $mapping = $userMetadata->getSqlResultSetMapping('mappingJoinedAddress');
562 $this->assertEquals(array(),$mapping['columns']);
563 $this->assertEquals('mappingJoinedAddress', $mapping['name']);
564 $this->assertNull($mapping['entities'][0]['discriminatorColumn']);
565 $this->assertEquals(array('name'=>'id','column'=>'id'), $mapping['entities'][0]['fields'][0]);
566 $this->assertEquals(array('name'=>'name','column'=>'name'), $mapping['entities'][0]['fields'][1]);
567 $this->assertEquals(array('name'=>'status','column'=>'status'), $mapping['entities'][0]['fields'][2]);
568 $this->assertEquals(array('name'=>'address.zip','column'=>'zip'), $mapping['entities'][0]['fields'][3]);
569 $this->assertEquals(array('name'=>'address.city','column'=>'city'), $mapping['entities'][0]['fields'][4]);
570 $this->assertEquals(array('name'=>'address.country','column'=>'country'), $mapping['entities'][0]['fields'][5]);
571 $this->assertEquals(array('name'=>'address.id','column'=>'a_id'), $mapping['entities'][0]['fields'][6]);
572 $this->assertEquals($userMetadata->name, $mapping['entities'][0]['entityClass']);
575 $mapping = $userMetadata->getSqlResultSetMapping('mappingJoinedPhonenumber');
576 $this->assertEquals(array(),$mapping['columns']);
577 $this->assertEquals('mappingJoinedPhonenumber', $mapping['name']);
578 $this->assertNull($mapping['entities'][0]['discriminatorColumn']);
579 $this->assertEquals(array('name'=>'id','column'=>'id'), $mapping['entities'][0]['fields'][0]);
580 $this->assertEquals(array('name'=>'name','column'=>'name'), $mapping['entities'][0]['fields'][1]);
581 $this->assertEquals(array('name'=>'status','column'=>'status'), $mapping['entities'][0]['fields'][2]);
582 $this->assertEquals(array('name'=>'phonenumbers.phonenumber','column'=>'number'), $mapping['entities'][0]['fields'][3]);
583 $this->assertEquals($userMetadata->name, $mapping['entities'][0]['entityClass']);
585 $mapping = $userMetadata->getSqlResultSetMapping('mappingUserPhonenumberCount');
586 $this->assertEquals(array('name'=>'numphones'),$mapping['columns'][0]);
587 $this->assertEquals('mappingUserPhonenumberCount', $mapping['name']);
588 $this->assertNull($mapping['entities'][0]['discriminatorColumn']);
589 $this->assertEquals(array('name'=>'id','column'=>'id'), $mapping['entities'][0]['fields'][0]);
590 $this->assertEquals(array('name'=>'name','column'=>'name'), $mapping['entities'][0]['fields'][1]);
591 $this->assertEquals(array('name'=>'status','column'=>'status'), $mapping['entities'][0]['fields'][2]);
592 $this->assertEquals($userMetadata->name, $mapping['entities'][0]['entityClass']);
594 $mapping = $userMetadata->getSqlResultSetMapping('mappingMultipleJoinsEntityResults');
595 $this->assertEquals(array('name'=>'numphones'),$mapping['columns'][0]);
596 $this->assertEquals('mappingMultipleJoinsEntityResults', $mapping['name']);
597 $this->assertNull($mapping['entities'][0]['discriminatorColumn']);
598 $this->assertEquals(array('name'=>'id','column'=>'u_id'), $mapping['entities'][0]['fields'][0]);
599 $this->assertEquals(array('name'=>'name','column'=>'u_name'), $mapping['entities'][0]['fields'][1]);
600 $this->assertEquals(array('name'=>'status','column'=>'u_status'), $mapping['entities'][0]['fields'][2]);
601 $this->assertEquals($userMetadata->name, $mapping['entities'][0]['entityClass']);
602 $this->assertNull($mapping['entities'][1]['discriminatorColumn']);
603 $this->assertEquals(array('name'=>'id','column'=>'a_id'), $mapping['entities'][1]['fields'][0]);
604 $this->assertEquals(array('name'=>'zip','column'=>'a_zip'), $mapping['entities'][1]['fields'][1]);
605 $this->assertEquals(array('name'=>'country','column'=>'a_country'), $mapping['entities'][1]['fields'][2]);
606 $this->assertEquals('Doctrine\Tests\Models\CMS\CmsAddress', $mapping['entities'][1]['entityClass']);
609 $this->assertCount(1, $personMetadata->getSqlResultSetMappings());
611 $mapping = $personMetadata->getSqlResultSetMapping('mappingFetchAll');
612 $this->assertEquals(array(),$mapping['columns']);
613 $this->assertEquals('mappingFetchAll', $mapping['name']);
614 $this->assertEquals('discriminator', $mapping['entities'][0]['discriminatorColumn']);
615 $this->assertEquals(array('name'=>'id','column'=>'id'), $mapping['entities'][0]['fields'][0]);
616 $this->assertEquals(array('name'=>'name','column'=>'name'), $mapping['entities'][0]['fields'][1]);
617 $this->assertEquals($personMetadata->name, $mapping['entities'][0]['entityClass']);
623 public function testAssociationOverridesMapping()
626 $factory = $this->createClassMetadataFactory();
627 $adminMetadata = $factory->getMetadataFor('Doctrine\Tests\Models\DDC964\DDC964Admin');
628 $guestMetadata = $factory->getMetadataFor('Doctrine\Tests\Models\DDC964\DDC964Guest');
631 // assert groups association mappings
632 $this->assertArrayHasKey('groups', $guestMetadata->associationMappings);
633 $this->assertArrayHasKey('groups', $adminMetadata->associationMappings);
635 $guestGroups = $guestMetadata->associationMappings['groups'];
636 $adminGroups = $adminMetadata->associationMappings['groups'];
638 // assert not override attributes
639 $this->assertEquals($guestGroups['fieldName'], $adminGroups['fieldName']);
640 $this->assertEquals($guestGroups['type'], $adminGroups['type']);
641 $this->assertEquals($guestGroups['mappedBy'], $adminGroups['mappedBy']);
642 $this->assertEquals($guestGroups['inversedBy'], $adminGroups['inversedBy']);
643 $this->assertEquals($guestGroups['isOwningSide'], $adminGroups['isOwningSide']);
644 $this->assertEquals($guestGroups['fetch'], $adminGroups['fetch']);
645 $this->assertEquals($guestGroups['isCascadeRemove'], $adminGroups['isCascadeRemove']);
646 $this->assertEquals($guestGroups['isCascadePersist'], $adminGroups['isCascadePersist']);
647 $this->assertEquals($guestGroups['isCascadeRefresh'], $adminGroups['isCascadeRefresh']);
648 $this->assertEquals($guestGroups['isCascadeMerge'], $adminGroups['isCascadeMerge']);
649 $this->assertEquals($guestGroups['isCascadeDetach'], $adminGroups['isCascadeDetach']);
651 // assert not override attributes
652 $this->assertEquals('ddc964_users_groups', $guestGroups['joinTable']['name']);
653 $this->assertEquals('user_id', $guestGroups['joinTable']['joinColumns'][0]['name']);
654 $this->assertEquals('group_id', $guestGroups['joinTable']['inverseJoinColumns'][0]['name']);
656 $this->assertEquals(array('user_id'=>'id'), $guestGroups['relationToSourceKeyColumns']);
657 $this->assertEquals(array('group_id'=>'id'), $guestGroups['relationToTargetKeyColumns']);
658 $this->assertEquals(array('user_id','group_id'), $guestGroups['joinTableColumns']);
661 $this->assertEquals('ddc964_users_admingroups', $adminGroups['joinTable']['name']);
662 $this->assertEquals('adminuser_id', $adminGroups['joinTable']['joinColumns'][0]['name']);
663 $this->assertEquals('admingroup_id', $adminGroups['joinTable']['inverseJoinColumns'][0]['name']);
665 $this->assertEquals(array('adminuser_id'=>'id'), $adminGroups['relationToSourceKeyColumns']);
666 $this->assertEquals(array('admingroup_id'=>'id'), $adminGroups['relationToTargetKeyColumns']);
667 $this->assertEquals(array('adminuser_id','admingroup_id'), $adminGroups['joinTableColumns']);
670 // assert address association mappings
671 $this->assertArrayHasKey('address', $guestMetadata->associationMappings);
672 $this->assertArrayHasKey('address', $adminMetadata->associationMappings);
674 $guestAddress = $guestMetadata->associationMappings['address'];
675 $adminAddress = $adminMetadata->associationMappings['address'];
677 // assert not override attributes
678 $this->assertEquals($guestAddress['fieldName'], $adminAddress['fieldName']);
679 $this->assertEquals($guestAddress['type'], $adminAddress['type']);
680 $this->assertEquals($guestAddress['mappedBy'], $adminAddress['mappedBy']);
681 $this->assertEquals($guestAddress['inversedBy'], $adminAddress['inversedBy']);
682 $this->assertEquals($guestAddress['isOwningSide'], $adminAddress['isOwningSide']);
683 $this->assertEquals($guestAddress['fetch'], $adminAddress['fetch']);
684 $this->assertEquals($guestAddress['isCascadeRemove'], $adminAddress['isCascadeRemove']);
685 $this->assertEquals($guestAddress['isCascadePersist'], $adminAddress['isCascadePersist']);
686 $this->assertEquals($guestAddress['isCascadeRefresh'], $adminAddress['isCascadeRefresh']);
687 $this->assertEquals($guestAddress['isCascadeMerge'], $adminAddress['isCascadeMerge']);
688 $this->assertEquals($guestAddress['isCascadeDetach'], $adminAddress['isCascadeDetach']);
691 $this->assertEquals('address_id', $guestAddress['joinColumns'][0]['name']);
692 $this->assertEquals(array('address_id'=>'id'), $guestAddress['sourceToTargetKeyColumns']);
693 $this->assertEquals(array('address_id'=>'address_id'), $guestAddress['joinColumnFieldNames']);
694 $this->assertEquals(array('id'=>'address_id'), $guestAddress['targetToSourceKeyColumns']);
697 $this->assertEquals('adminaddress_id', $adminAddress['joinColumns'][0]['name']);
698 $this->assertEquals(array('adminaddress_id'=>'id'), $adminAddress['sourceToTargetKeyColumns']);
699 $this->assertEquals(array('adminaddress_id'=>'adminaddress_id'), $adminAddress['joinColumnFieldNames']);
700 $this->assertEquals(array('id'=>'adminaddress_id'), $adminAddress['targetToSourceKeyColumns']);
706 public function testAttributeOverridesMapping()
709 $factory = $this->createClassMetadataFactory();
710 $guestMetadata = $factory->getMetadataFor('Doctrine\Tests\Models\DDC964\DDC964Guest');
711 $adminMetadata = $factory->getMetadataFor('Doctrine\Tests\Models\DDC964\DDC964Admin');
713 $this->assertTrue($adminMetadata->fieldMappings['id']['id']);
714 $this->assertEquals('id', $adminMetadata->fieldMappings['id']['fieldName']);
715 $this->assertEquals('user_id', $adminMetadata->fieldMappings['id']['columnName']);
716 $this->assertEquals(array('user_id'=>'id','user_name'=>'name'), $adminMetadata->fieldNames);
717 $this->assertEquals(array('id'=>'user_id','name'=>'user_name'), $adminMetadata->columnNames);
718 $this->assertEquals(150, $adminMetadata->fieldMappings['id']['length']);
721 $this->assertEquals('name', $adminMetadata->fieldMappings['name']['fieldName']);
722 $this->assertEquals('user_name', $adminMetadata->fieldMappings['name']['columnName']);
723 $this->assertEquals(250, $adminMetadata->fieldMappings['name']['length']);
724 $this->assertTrue($adminMetadata->fieldMappings['name']['nullable']);
725 $this->assertFalse($adminMetadata->fieldMappings['name']['unique']);
728 $this->assertTrue($guestMetadata->fieldMappings['id']['id']);
729 $this->assertEquals('guest_id', $guestMetadata->fieldMappings['id']['columnName']);
730 $this->assertEquals('id', $guestMetadata->fieldMappings['id']['fieldName']);
731 $this->assertEquals(array('guest_id'=>'id','guest_name'=>'name'), $guestMetadata->fieldNames);
732 $this->assertEquals(array('id'=>'guest_id','name'=>'guest_name'), $guestMetadata->columnNames);
733 $this->assertEquals(140, $guestMetadata->fieldMappings['id']['length']);
735 $this->assertEquals('name', $guestMetadata->fieldMappings['name']['fieldName']);
736 $this->assertEquals('guest_name', $guestMetadata->fieldMappings['name']['columnName']);
737 $this->assertEquals(240, $guestMetadata->fieldMappings['name']['length']);
738 $this->assertFalse($guestMetadata->fieldMappings['name']['nullable']);
739 $this->assertTrue($guestMetadata->fieldMappings['name']['unique']);
746 * @HasLifecycleCallbacks
749 * uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "user_email"})},
750 * indexes={@Index(name="name_idx", columns={"name"}), @Index(name="0", columns={"user_email"})},
751 * options={"foo": "bar", "baz": {"key": "val"}}
753 * @NamedQueries({@NamedQuery(name="all", query="SELECT u FROM __CLASS__ u")})
759 * @Column(type="integer")
760 * @generatedValue(strategy="AUTO")
761 * @SequenceGenerator(sequenceName="tablename_seq", initialValue=1, allocationSize=100)
766 * @Column(length=50, nullable=true, unique=true, options={"foo": "bar", "baz": {"key": "val"}})
771 * @Column(name="user_email", columnDefinition="CHAR(32) NOT NULL")
776 * @OneToOne(targetEntity="Address", cascade={"remove"}, inversedBy="user")
777 * @JoinColumn(onDelete="CASCADE")
782 * @OneToMany(targetEntity="Phonenumber", mappedBy="user", cascade={"persist"}, orphanRemoval=true)
783 * @OrderBy({"number"="ASC"})
785 public $phonenumbers;
788 * @ManyToMany(targetEntity="Group", cascade={"all"})
789 * @JoinTable(name="cms_user_groups",
790 * joinColumns={@JoinColumn(name="user_id", referencedColumnName="id", nullable=false, unique=false)},
791 * inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id", columnDefinition="INT NULL")}
800 public function doStuffOnPrePersist()
807 public function doOtherStuffOnPrePersistToo() {
813 public function doStuffOnPostPersist()
818 public static function loadMetadata(ClassMetadataInfo $metadata)
820 $metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_NONE);
821 $metadata->setPrimaryTable(array(
822 'name' => 'cms_users',
823 'options' => array('foo' => 'bar', 'baz' => array('key' => 'val')),
825 $metadata->setChangeTrackingPolicy(ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT);
826 $metadata->addLifecycleCallback('doStuffOnPrePersist', 'prePersist');
827 $metadata->addLifecycleCallback('doOtherStuffOnPrePersistToo', 'prePersist');
828 $metadata->addLifecycleCallback('doStuffOnPostPersist', 'postPersist');
829 $metadata->mapField(array(
833 'columnName' => 'id',
835 $metadata->mapField(array(
836 'fieldName' => 'name',
841 'columnName' => 'name',
842 'options' => array('foo' => 'bar', 'baz' => array('key' => 'val')),
844 $metadata->mapField(array(
845 'fieldName' => 'email',
847 'columnName' => 'user_email',
848 'columnDefinition' => 'CHAR(32) NOT NULL',
850 $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO);
851 $metadata->mapOneToOne(array(
852 'fieldName' => 'address',
853 'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Address',
859 'inversedBy' => 'user',
864 'name' => 'address_id',
865 'referencedColumnName' => 'id',
866 'onDelete' => 'CASCADE',
869 'orphanRemoval' => false,
871 $metadata->mapOneToMany(array(
872 'fieldName' => 'phonenumbers',
873 'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Phonenumber',
878 'mappedBy' => 'user',
879 'orphanRemoval' => true,
885 $metadata->mapManyToMany(array(
886 'fieldName' => 'groups',
887 'targetEntity' => 'Doctrine\\Tests\\ORM\\Mapping\\Group',
899 'name' => 'cms_users_groups',
905 'referencedColumnName' => 'id',
910 'inverseJoinColumns' =>
914 'name' => 'group_id',
915 'referencedColumnName' => 'id',
916 'columnDefinition' => 'INT NULL',
922 $metadata->table['uniqueConstraints'] = array(
923 'search_idx' => array('columns' => array('name', 'user_email')),
925 $metadata->table['indexes'] = array(
926 'name_idx' => array('columns' => array('name')), 0 => array('columns' => array('user_email'))
928 $metadata->setSequenceGeneratorDefinition(array(
929 'sequenceName' => 'tablename_seq',
930 'allocationSize' => 100,
933 $metadata->addNamedQuery(array(
935 'query' => 'SELECT u FROM __CLASS__ u'
942 * @InheritanceType("SINGLE_TABLE")
943 * @DiscriminatorMap({"cat" = "Cat", "dog" = "Dog"})
944 * @DiscriminatorColumn(name="discr", length=32, type="string")
946 abstract class Animal
949 * @Id @Column(type="string") @GeneratedValue(strategy="CUSTOM")
950 * @CustomIdGenerator(class="stdClass")
954 public static function loadMetadata(ClassMetadataInfo $metadata)
956 $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_CUSTOM);
957 $metadata->setCustomGeneratorDefinition(array("class" => "stdClass"));
962 class Cat extends Animal
964 public static function loadMetadata(ClassMetadataInfo $metadata)
971 class Dog extends Animal
973 public static function loadMetadata(ClassMetadataInfo $metadata)
987 * @param string $value
989 function __construct($value = null)
991 $this->value = $value;
996 * @GeneratedValue(strategy="NONE")
997 * @Column(type="integer", columnDefinition = "INT unsigned NOT NULL")
1002 * @Column(columnDefinition = "VARCHAR(255) NOT NULL")
1009 public function getId()
1017 public function getValue()
1019 return $this->value;
1022 public static function loadMetadata(ClassMetadataInfo $metadata)
1024 $metadata->mapField(array(
1026 'fieldName' => 'id',
1027 'columnDefinition' => 'INT unsigned NOT NULL',
1030 $metadata->mapField(array(
1031 'fieldName' => 'value',
1032 'columnDefinition' => 'VARCHAR(255) NOT NULL'
1035 $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_NONE);
1042 * @InheritanceType("SINGLE_TABLE")
1043 * @DiscriminatorMap({"ONE" = "DDC807SubClasse1", "TWO" = "DDC807SubClasse2"})
1044 * @DiscriminatorColumn(name = "dtype", columnDefinition="ENUM('ONE','TWO')")
1050 * @Column(type="integer")
1051 * @GeneratedValue(strategy="NONE")
1055 public static function loadMetadata(ClassMetadataInfo $metadata)
1057 $metadata->mapField(array(
1059 'fieldName' => 'id',
1062 $metadata->setDiscriminatorColumn(array(
1065 'columnDefinition' => "ENUM('ONE','TWO')"
1068 $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_NONE);
1073 class DDC807SubClasse1 {}
1074 class DDC807SubClasse2 {}
1077 class Phonenumber {}