Skip to content

Instantly share code, notes, and snippets.

@doctrinebot
Created December 13, 2015 18:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doctrinebot/c242d81847740ff4d311 to your computer and use it in GitHub Desktop.
Save doctrinebot/c242d81847740ff4d311 to your computer and use it in GitHub Desktop.
Attachments to Doctrine Jira Issue DDC-263 - https://github.com/doctrine/doctrine2/issues/3363
Index: lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php
===================================================================
--- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (revision 7037)
+++ lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (working copy)
@@ -244,7 +244,7 @@
}
if (isset($oneToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement['cascade']);
+ $mapping['cascade'] = $oneToOneElement['cascade'];
}
$metadata->mapOneToOne($mapping);
@@ -265,7 +265,7 @@
}
if (isset($oneToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement['cascade']);
+ $mapping['cascade'] = $oneToManyElement['cascade'];
}
$metadata->mapOneToMany($mapping);
@@ -303,7 +303,7 @@
$mapping['joinColumns'] = $joinColumns;
if (isset($manyToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement['cascade']);
+ $mapping['cascade'] = $manyToOneElement['cascade'];
}
$metadata->mapManyToOne($mapping);
@@ -356,7 +356,7 @@
}
if (isset($manyToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement['cascade']);
+ $mapping['cascade'] = $manyToManyElement['cascade'];
}
$metadata->mapManyToMany($mapping);
@@ -409,35 +409,6 @@
}
/**
- * Gathers a list of cascade options found in the given cascade element.
- *
- * @param $cascadeElement The cascade element.
- * @return array The list of cascade options.
- */
- private function _getCascadeMappings($cascadeElement)
- {
- $cascades = array();
-
- if (isset($cascadeElement['cascadePersist'])) {
- $cascades[] = 'persist';
- }
-
- if (isset($cascadeElement['cascadeRemove'])) {
- $cascades[] = 'remove';
- }
-
- if (isset($cascadeElement['cascadeMerge'])) {
- $cascades[] = 'merge';
- }
-
- if (isset($cascadeElement['cascadeRefresh'])) {
- $cascades[] = 'refresh';
- }
-
- return $cascades;
- }
-
- /**
* Loads a mapping file with the given name and returns a map
* from class/entity names to their corresponding elements.
*
Index: lib/Doctrine/ORM/Mapping/AssociationMapping.php
===================================================================
--- lib/Doctrine/ORM/Mapping/AssociationMapping.php (revision 7037)
+++ lib/Doctrine/ORM/Mapping/AssociationMapping.php (working copy)
@@ -167,11 +167,22 @@
$this->fetchMode = isset($mapping['fetch']) ?
$mapping['fetch'] : self::FETCH_LAZY;
$cascades = isset($mapping['cascade']) ? $mapping['cascade'] : array();
- $this->isCascadeRemove = in_array('remove', $cascades);
+
+ if (in_array('all', $cascades)) {
+ $cascades = array(
+ 'remove',
+ 'persist',
+ 'refresh',
+ 'merge',
+ 'detach'
+ );
+ }
+
+ $this->isCascadeRemove = in_array('remove', $cascades);
$this->isCascadePersist = in_array('persist', $cascades);
$this->isCascadeRefresh = in_array('refresh', $cascades);
- $this->isCascadeMerge = in_array('merge', $cascades);
- $this->isCascadeDetach = in_array('detach', $cascades);
+ $this->isCascadeMerge = in_array('merge', $cascades);
+ $this->isCascadeDetach = in_array('detach', $cascades);
}
/**
Index: tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml (working copy)
@@ -16,11 +16,12 @@
joinColumn:
name: address_id
referencedColumnName: id
+ cascade: [ remove ]
oneToMany:
phonenumbers:
targetEntity: Phonenumber
mappedBy: user
- cascade: cascadePersist
+ cascade: [ persist ]
manyToMany:
groups:
targetEntity: Group
@@ -32,6 +33,8 @@
inverseJoinColumns:
group_id:
referencedColumnName: id
+ cascade:
+ - all
lifecycleCallbacks:
doStuffOnPrePersist: prePersist
doStuffOnPostPersist: postPersist
\ No newline at end of file
Index: tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml (working copy)
@@ -20,6 +20,9 @@
<one-to-one field="address" target-entity="Address">
<join-column name="address_id" referenced-column-name="id"/>
+ <cascade>
+ <cascade-remove />
+ </cascade>
</one-to-one>
<one-to-many field="phonenumbers" target-entity="Phonenumber" mapped-by="user">
@@ -37,8 +40,11 @@
<join-column name="group_id" referenced-column-name="id"/>
</inverse-join-columns>
</join-table>
+ <cascade>
+ <cascade-all/>
+ </cascade>
</many-to-many>
</entity>
-</doctrine-mapping>
\ No newline at end of file
+</doctrine-mapping>
Index: tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php (working copy)
@@ -67,6 +67,12 @@
$this->assertTrue($class->associationMappings['address'] instanceof \Doctrine\ORM\Mapping\OneToOneMapping);
$this->assertTrue(isset($class->associationMappings['address']));
$this->assertTrue($class->associationMappings['address']->isOwningSide);
+ // Check cascading
+ $this->assertTrue($class->associationMappings['address']->isCascadeRemove);
+ $this->assertFalse($class->associationMappings['address']->isCascadePersist);
+ $this->assertFalse($class->associationMappings['address']->isCascadeRefresh);
+ $this->assertFalse($class->associationMappings['address']->isCascadeDetach);
+ $this->assertFalse($class->associationMappings['address']->isCascadeMerge);
$this->assertTrue($class->associationMappings['phonenumbers'] instanceof \Doctrine\ORM\Mapping\OneToManyMapping);
$this->assertTrue(isset($class->associationMappings['phonenumbers']));
@@ -80,6 +86,12 @@
$this->assertEquals(count($class->lifecycleCallbacks), 2);
$this->assertEquals($class->lifecycleCallbacks['prePersist'][0], 'doStuffOnPrePersist');
$this->assertEquals($class->lifecycleCallbacks['postPersist'][0], 'doStuffOnPostPersist');
+ // Make sure that cascade-all works as expected
+ $this->assertTrue($class->associationMappings['groups']->isCascadeRemove);
+ $this->assertTrue($class->associationMappings['groups']->isCascadePersist);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeRefresh);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeDetach);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeMerge);
}
}
Index: lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php
===================================================================
--- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php (working copy)
@@ -232,7 +232,7 @@
if (isset($oneToOneElement->cascade)) {
$mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement->cascade);
}
-
+
if (isset($oneToOneElement->{'orphan-removal'})) {
$mapping['orphanRemoval'] = (bool)$oneToOneElement->{'orphan-removal'};
}
@@ -433,24 +433,15 @@
*/
private function _getCascadeMappings($cascadeElement)
{
- $cascades = array();
-
- if (isset($cascadeElement->{'cascade-persist'})) {
- $cascades[] = 'persist';
- }
-
- if (isset($cascadeElement->{'cascade-remove'})) {
- $cascades[] = 'remove';
- }
-
- if (isset($cascadeElement->{'cascade-merge'})) {
- $cascades[] = 'merge';
+ $cascades = array();
+ foreach ($cascadeElement->children() as $action) {
+ // According to the JPA specifications, XML uses "cascade-persist"
+ // instead of "persist". Here, both variations
+ // are supported because both YAML and Annotation use "persist"
+ // and we want to make sure that this driver doesn't need to know
+ // anything about the supported cascading actions
+ $cascades[] = str_replace('cascade-', '', $action->getName());
}
-
- if (isset($cascadeElement->{'cascade-refresh'})) {
- $cascades[] = 'refresh';
- }
-
return $cascades;
}
}
\ No newline at end of file
Index: lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php
===================================================================
--- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (working copy)
@@ -247,7 +247,7 @@
}
if (isset($oneToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement['cascade']);
+ $mapping['cascade'] = $oneToOneElement['cascade'];
}
$metadata->mapOneToOne($mapping);
@@ -268,7 +268,7 @@
}
if (isset($oneToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement['cascade']);
+ $mapping['cascade'] = $oneToManyElement['cascade'];
}
$metadata->mapOneToMany($mapping);
@@ -306,7 +306,7 @@
$mapping['joinColumns'] = $joinColumns;
if (isset($manyToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement['cascade']);
+ $mapping['cascade'] = $manyToOneElement['cascade'];
}
$metadata->mapManyToOne($mapping);
@@ -359,7 +359,7 @@
}
if (isset($manyToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement['cascade']);
+ $mapping['cascade'] = $manyToManyElement['cascade'];
}
$metadata->mapManyToMany($mapping);
@@ -412,35 +412,6 @@
}
/**
- * Gathers a list of cascade options found in the given cascade element.
- *
- * @param $cascadeElement The cascade element.
- * @return array The list of cascade options.
- */
- private function _getCascadeMappings($cascadeElement)
- {
- $cascades = array();
-
- if (isset($cascadeElement['cascadePersist'])) {
- $cascades[] = 'persist';
- }
-
- if (isset($cascadeElement['cascadeRemove'])) {
- $cascades[] = 'remove';
- }
-
- if (isset($cascadeElement['cascadeMerge'])) {
- $cascades[] = 'merge';
- }
-
- if (isset($cascadeElement['cascadeRefresh'])) {
- $cascades[] = 'refresh';
- }
-
- return $cascades;
- }
-
- /**
* Loads a mapping file with the given name and returns a map
* from class/entity names to their corresponding elements.
*
Index: lib/Doctrine/ORM/Mapping/AssociationMapping.php
===================================================================
--- lib/Doctrine/ORM/Mapping/AssociationMapping.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/AssociationMapping.php (working copy)
@@ -167,11 +167,22 @@
$this->fetchMode = isset($mapping['fetch']) ?
$mapping['fetch'] : self::FETCH_LAZY;
$cascades = isset($mapping['cascade']) ? $mapping['cascade'] : array();
- $this->isCascadeRemove = in_array('remove', $cascades);
+
+ if (in_array('all', $cascades)) {
+ $cascades = array(
+ 'remove',
+ 'persist',
+ 'refresh',
+ 'merge',
+ 'detach'
+ );
+ }
+
+ $this->isCascadeRemove = in_array('remove', $cascades);
$this->isCascadePersist = in_array('persist', $cascades);
$this->isCascadeRefresh = in_array('refresh', $cascades);
- $this->isCascadeMerge = in_array('merge', $cascades);
- $this->isCascadeDetach = in_array('detach', $cascades);
+ $this->isCascadeMerge = in_array('merge', $cascades);
+ $this->isCascadeDetach = in_array('detach', $cascades);
}
/**
Index: tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.User.dcm.yml (working copy)
@@ -16,11 +16,12 @@
joinColumn:
name: address_id
referencedColumnName: id
+ cascade: [ remove ]
oneToMany:
phonenumbers:
targetEntity: Phonenumber
mappedBy: user
- cascade: cascadePersist
+ cascade: [ persist ]
manyToMany:
groups:
targetEntity: Group
@@ -32,6 +33,8 @@
inverseJoinColumns:
group_id:
referencedColumnName: id
+ cascade:
+ - all
lifecycleCallbacks:
doStuffOnPrePersist: prePersist
doStuffOnPostPersist: postPersist
\ No newline at end of file
Index: tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml (working copy)
@@ -20,6 +20,9 @@
<one-to-one field="address" target-entity="Address">
<join-column name="address_id" referenced-column-name="id"/>
+ <cascade>
+ <cascade-remove />
+ </cascade>
</one-to-one>
<one-to-many field="phonenumbers" target-entity="Phonenumber" mapped-by="user">
@@ -37,8 +40,11 @@
<join-column name="group_id" referenced-column-name="id"/>
</inverse-join-columns>
</join-table>
+ <cascade>
+ <cascade-all/>
+ </cascade>
</many-to-many>
</entity>
-</doctrine-mapping>
\ No newline at end of file
+</doctrine-mapping>
Index: tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php
===================================================================
--- tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php (revision 7045)
+++ tests/Doctrine/Tests/ORM/Mapping/MappingDriverTest.php (working copy)
@@ -67,6 +67,12 @@
$this->assertTrue($class->associationMappings['address'] instanceof \Doctrine\ORM\Mapping\OneToOneMapping);
$this->assertTrue(isset($class->associationMappings['address']));
$this->assertTrue($class->associationMappings['address']->isOwningSide);
+ // Check cascading
+ $this->assertTrue($class->associationMappings['address']->isCascadeRemove);
+ $this->assertFalse($class->associationMappings['address']->isCascadePersist);
+ $this->assertFalse($class->associationMappings['address']->isCascadeRefresh);
+ $this->assertFalse($class->associationMappings['address']->isCascadeDetach);
+ $this->assertFalse($class->associationMappings['address']->isCascadeMerge);
$this->assertTrue($class->associationMappings['phonenumbers'] instanceof \Doctrine\ORM\Mapping\OneToManyMapping);
$this->assertTrue(isset($class->associationMappings['phonenumbers']));
@@ -80,6 +86,12 @@
$this->assertEquals(count($class->lifecycleCallbacks), 2);
$this->assertEquals($class->lifecycleCallbacks['prePersist'][0], 'doStuffOnPrePersist');
$this->assertEquals($class->lifecycleCallbacks['postPersist'][0], 'doStuffOnPostPersist');
+ // Make sure that cascade-all works as expected
+ $this->assertTrue($class->associationMappings['groups']->isCascadeRemove);
+ $this->assertTrue($class->associationMappings['groups']->isCascadePersist);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeRefresh);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeDetach);
+ $this->assertTrue($class->associationMappings['groups']->isCascadeMerge);
}
}
Index: lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php
===================================================================
--- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php (working copy)
@@ -232,7 +232,7 @@
if (isset($oneToOneElement->cascade)) {
$mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement->cascade);
}
-
+
if (isset($oneToOneElement->{'orphan-removal'})) {
$mapping['orphanRemoval'] = (bool)$oneToOneElement->{'orphan-removal'};
}
@@ -433,24 +433,15 @@
*/
private function _getCascadeMappings($cascadeElement)
{
- $cascades = array();
-
- if (isset($cascadeElement->{'cascade-persist'})) {
- $cascades[] = 'persist';
- }
-
- if (isset($cascadeElement->{'cascade-remove'})) {
- $cascades[] = 'remove';
- }
-
- if (isset($cascadeElement->{'cascade-merge'})) {
- $cascades[] = 'merge';
+ $cascades = array();
+ foreach ($cascadeElement->children() as $action) {
+ // According to the JPA specifications, XML uses "cascade-persist"
+ // instead of "persist". Here, both variations
+ // are supported because both YAML and Annotation use "persist"
+ // and we want to make sure that this driver doesn't need to know
+ // anything about the supported cascading actions
+ $cascades[] = str_replace('cascade-', '', $action->getName());
}
-
- if (isset($cascadeElement->{'cascade-refresh'})) {
- $cascades[] = 'refresh';
- }
-
return $cascades;
}
}
\ No newline at end of file
Index: lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php
===================================================================
--- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php (working copy)
@@ -247,7 +247,7 @@
}
if (isset($oneToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToOneElement['cascade']);
+ $mapping['cascade'] = $oneToOneElement['cascade'];
}
$metadata->mapOneToOne($mapping);
@@ -268,7 +268,7 @@
}
if (isset($oneToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($oneToManyElement['cascade']);
+ $mapping['cascade'] = $oneToManyElement['cascade'];
}
$metadata->mapOneToMany($mapping);
@@ -306,7 +306,7 @@
$mapping['joinColumns'] = $joinColumns;
if (isset($manyToOneElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToOneElement['cascade']);
+ $mapping['cascade'] = $manyToOneElement['cascade'];
}
$metadata->mapManyToOne($mapping);
@@ -359,7 +359,7 @@
}
if (isset($manyToManyElement['cascade'])) {
- $mapping['cascade'] = $this->_getCascadeMappings($manyToManyElement['cascade']);
+ $mapping['cascade'] = $manyToManyElement['cascade'];
}
$metadata->mapManyToMany($mapping);
@@ -412,35 +412,6 @@
}
/**
- * Gathers a list of cascade options found in the given cascade element.
- *
- * @param $cascadeElement The cascade element.
- * @return array The list of cascade options.
- */
- private function _getCascadeMappings($cascadeElement)
- {
- $cascades = array();
-
- if (isset($cascadeElement['cascadePersist'])) {
- $cascades[] = 'persist';
- }
-
- if (isset($cascadeElement['cascadeRemove'])) {
- $cascades[] = 'remove';
- }
-
- if (isset($cascadeElement['cascadeMerge'])) {
- $cascades[] = 'merge';
- }
-
- if (isset($cascadeElement['cascadeRefresh'])) {
- $cascades[] = 'refresh';
- }
-
- return $cascades;
- }
-
- /**
* Loads a mapping file with the given name and returns a map
* from class/entity names to their corresponding elements.
*
Index: lib/Doctrine/ORM/Mapping/AssociationMapping.php
===================================================================
--- lib/Doctrine/ORM/Mapping/AssociationMapping.php (revision 7045)
+++ lib/Doctrine/ORM/Mapping/AssociationMapping.php (working copy)
@@ -167,11 +167,22 @@
$this->fetchMode = isset($mapping['fetch']) ?
$mapping['fetch'] : self::FETCH_LAZY;
$cascades = isset($mapping['cascade']) ? $mapping['cascade'] : array();
- $this->isCascadeRemove = in_array('remove', $cascades);
+
+ if (in_array('all', $cascades)) {
+ $cascades = array(
+ 'remove',
+ 'persist',
+ 'refresh',
+ 'merge',
+ 'detach'
+ );
+ }
+
+ $this->isCascadeRemove = in_array('remove', $cascades);
$this->isCascadePersist = in_array('persist', $cascades);
$this->isCascadeRefresh = in_array('refresh', $cascades);
- $this->isCascadeMerge = in_array('merge', $cascades);
- $this->isCascadeDetach = in_array('detach', $cascades);
+ $this->isCascadeMerge = in_array('merge', $cascades);
+ $this->isCascadeDetach = in_array('detach', $cascades);
}
/**
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment