diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php index a0216bf91..3e96af821 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php @@ -200,6 +200,25 @@ abstract class AbstractExporter } } + /** + * @param int $mode + * + * @return string + */ + protected function _getFetchModeString($mode) + { + switch ($mode) { + case ClassMetadataInfo::FETCH_EAGER: + return 'EAGER'; + + case ClassMetadataInfo::FETCH_EXTRA_LAZY: + return 'EXTRA_LAZY'; + + case ClassMetadataInfo::FETCH_LAZY: + return 'LAZY'; + } + } + /** * @param int $policy * diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php index 778c30f49..29eb37afc 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php @@ -108,6 +108,10 @@ class PhpExporter extends AbstractExporter 'cascade' => $cascade, ); + if (isset($associationMapping['fetch'])) { + $associationMappingArray['fetch'] = $associationMapping['fetch']; + } + if ($associationMapping['type'] & ClassMetadataInfo::TO_ONE) { $method = 'mapOneToOne'; $oneToOneMappingArray = array( diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php index 094889c1a..8d1bfc37c 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php @@ -265,6 +265,10 @@ class XmlExporter extends AbstractExporter if (isset($associationMapping['orphanRemoval']) && $associationMapping['orphanRemoval'] !== false) { $associationMappingXml->addAttribute('orphan-removal', 'true'); } + + if (isset($associationMapping['fetch'])) { + $associationMappingXml->addAttribute('fetch', $this->_getFetchModeString($associationMapping['fetch'])); + } $cascade = array(); if ($associationMapping['isCascadeRemove']) { diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php index 4b401c9f0..177cebfab 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/YamlExporter.php @@ -154,6 +154,10 @@ class YamlExporter extends AbstractExporter 'cascade' => $cascade, ); + if (isset($associationMapping['fetch'])) { + $associationMappingArray['fetch'] = $this->_getFetchModeString($associationMapping['fetch']); + } + if (isset($mapping['id']) && $mapping['id'] === true) { $array['id'][$name]['associationKey'] = true; } diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php index c792746cc..3ad2c88f1 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php @@ -226,7 +226,7 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $this->assertEquals(1, count($nodes)); } else { - $this->markTestSkipped('Test available only for '.$type.' driver'); + $this->markTestSkipped('Test not available for '.$type.' driver'); } } @@ -248,6 +248,7 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $this->assertFalse($class->associationMappings['address']['isCascadeMerge']); $this->assertFalse($class->associationMappings['address']['isCascadeDetach']); $this->assertTrue($class->associationMappings['address']['orphanRemoval']); + $this->assertEquals(ClassMetadataInfo::FETCH_EAGER, $class->associationMappings['address']['fetch']); return $class; } @@ -279,6 +280,7 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $this->assertTrue($class->associationMappings['phonenumbers']['isCascadeMerge']); $this->assertFalse($class->associationMappings['phonenumbers']['isCascadeDetach']); $this->assertTrue($class->associationMappings['phonenumbers']['orphanRemoval']); + $this->assertEquals(ClassMetadataInfo::FETCH_LAZY, $class->associationMappings['phonenumbers']['fetch']); return $class; } @@ -306,6 +308,7 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $this->assertTrue($class->associationMappings['groups']['isCascadeRefresh']); $this->assertTrue($class->associationMappings['groups']['isCascadeMerge']); $this->assertTrue($class->associationMappings['groups']['isCascadeDetach']); + $this->assertEquals(ClassMetadataInfo::FETCH_EXTRA_LAZY, $class->associationMappings['groups']['fetch']); return $class; } @@ -376,7 +379,7 @@ abstract class AbstractClassMetadataExporterTest extends \Doctrine\Tests\OrmTest $this->assertEquals('all', $value['Doctrine\Tests\ORM\Tools\Export\ExportedUser']['oneToMany']['interests']['cascade'][0]); } else { - $this->markTestSkipped('Test available only for '.$type.' driver'); + $this->markTestSkipped('Test not available for '.$type.' driver'); } } public function __destruct() diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php index f153a7c83..3bac8c2ae 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/Doctrine.Tests.ORM.Tools.Export.User.php @@ -23,7 +23,7 @@ class User public $email; /** - * @OneToOne(targetEntity="Doctrine\Tests\ORM\Tools\Export\Address", inversedBy="user", cascade={"persist"}, orphanRemoval=true) + * @OneToOne(targetEntity="Doctrine\Tests\ORM\Tools\Export\Address", inversedBy="user", cascade={"persist"}, orphanRemoval=true, fetch="EAGER") * @JoinColumn(name="address_id", onDelete="CASCADE") */ public $address; @@ -41,7 +41,7 @@ class User public $phonenumbers; /** - * @ManyToMany(targetEntity="Doctrine\Tests\ORM\Tools\Export\Group", cascade={"all"}) + * @ManyToMany(targetEntity="Doctrine\Tests\ORM\Tools\Export\Group", cascade={"all"}, fetch="EXTRA_LAZY") * @JoinTable(name="cms_users_groups", * joinColumns={@JoinColumn(name="user_id", referencedColumnName="id", nullable=false, unique=false)}, * inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id", columnDefinition="INT NULL")} diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php index f272ca0aa..061934b9b 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php @@ -55,6 +55,7 @@ $metadata->mapOneToOne(array( ), ), 'orphanRemoval' => true, + 'fetch' => ClassMetadataInfo::FETCH_EAGER, )); $metadata->mapOneToMany(array( 'fieldName' => 'phonenumbers', @@ -66,6 +67,7 @@ $metadata->mapOneToMany(array( ), 'mappedBy' => 'user', 'orphanRemoval' => true, + 'fetch' => ClassMetadataInfo::FETCH_LAZY, 'orderBy' => array( 'number' => 'ASC', @@ -74,6 +76,7 @@ $metadata->mapOneToMany(array( $metadata->mapManyToMany(array( 'fieldName' => 'groups', 'targetEntity' => 'Doctrine\\Tests\\ORM\\Tools\\Export\\Group', + 'fetch' => ClassMetadataInfo::FETCH_EXTRA_LAZY, 'cascade' => array( 0 => 'remove', diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml b/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml index dfec31ec0..8e30948e8 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Tools/Export/xml/Doctrine.Tests.ORM.Tools.Export.User.dcm.xml @@ -25,14 +25,14 @@ - + - + @@ -52,7 +52,7 @@ - + diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml b/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml index b43aefad7..1a5b77609 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Tools/Export/yaml/Doctrine.Tests.ORM.Tools.Export.User.dcm.yml @@ -29,6 +29,7 @@ Doctrine\Tests\ORM\Tools\Export\User: cascade: [ persist ] inversedBy: user orphanRemoval: true + fetch: EAGER manyToOne: mainGroup: targetEntity: Doctrine\Tests\ORM\Tools\Export\Group @@ -40,6 +41,7 @@ Doctrine\Tests\ORM\Tools\Export\User: number: ASC cascade: [ persist, merge ] orphanRemoval: true + fetch: LAZY interests: targetEntity: Doctrine\Tests\ORM\Tools\Export\Interests mappedBy: user @@ -48,6 +50,7 @@ Doctrine\Tests\ORM\Tools\Export\User: manyToMany: groups: targetEntity: Doctrine\Tests\ORM\Tools\Export\Group + fetch: EXTRA_LAZY joinTable: name: cms_users_groups joinColumns: