Kaynağa Gözat

ZF-11810: Zend_Db: Update cascade on table delete to match row delete introduced in ZF-1103

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24957 44c647ce-9c0f-0410-b52a-842ac1e357ba
adamlundrigan 13 yıl önce
ebeveyn
işleme
b1c4170c7e

+ 16 - 0
library/Zend/Db/Table/Abstract.php

@@ -1181,6 +1181,22 @@ abstract class Zend_Db_Table_Abstract
      */
     public function delete($where)
     {
+        $depTables = $this->getDependentTables();
+        if (!empty($depTables)) {
+            $resultSet = $this->fetchAll($where);
+            if (count($resultSet) > 0 ) {
+                foreach ($resultSet as $row) {
+                    /**
+                     * Execute cascading deletes against dependent tables
+                     */
+                    foreach ($depTables as $tableClass) {
+                        $t = self::getTableFromString($tableClass, $this);
+                        $t->_cascadeDelete($tableClass, $row->getPrimaryKey());
+                    }
+                }
+            }
+        }
+
         $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name;
         return $this->_db->delete($tableSpec, $where);
     }

+ 33 - 0
tests/Zend/Db/Table/TestCommon.php

@@ -1646,6 +1646,39 @@ abstract class Zend_Db_Table_TestCommon extends Zend_Db_Table_TestSetup
         $this->assertType('Zend_Db_Table_Row', $tblRecursive->find(6)->current());
     }
 
+    /**
+     * @group ZF-11810
+     */
+    public function testTableCascadeRecurseDeleteUsingTableDeleteMethod()
+    {
+        $tblRecursive = $this->_getTable('My_ZendDbTable_TableCascadeRecursive');
+
+        // Enforce initial table structure
+        $parentRow = $tblRecursive->find(1)->current();
+        $this->assertType('Zend_Db_Table_Row', $parentRow);
+        $childRows = $parentRow->findDependentRowset('My_ZendDbTable_TableCascadeRecursive', 'Children');
+        $this->assertType('Zend_Db_Table_Rowset', $childRows);
+        $this->assertEquals(2, count($childRows));
+        foreach ( $childRows as $childRow ) {
+            $this->assertType('Zend_Db_Table_Row', $childRow);
+            $subChildRows = $childRow->findDependentRowset('My_ZendDbTable_TableCascadeRecursive', 'Children');
+            $this->assertType('Zend_Db_Table_Rowset', $subChildRows);
+            $this->assertEquals( $childRow['item_id'] == 3 ? 2 : 0 , count($subChildRows));
+        }
+
+        // Perform the delete
+        $tblRecursive->delete($tblRecursive->getAdapter()->quoteInto('item_id = ?', 1));
+
+        // Assert that all children of #1 (2,3,4,5) are removed recursively
+        $this->assertNull($tblRecursive->find(1)->current());
+        $this->assertNull($tblRecursive->find(2)->current());
+        $this->assertNull($tblRecursive->find(3)->current());
+        $this->assertNull($tblRecursive->find(4)->current());
+        $this->assertNull($tblRecursive->find(5)->current());
+        //... but #6 remains
+        $this->assertType('Zend_Db_Table_Row', $tblRecursive->find(6)->current());
+    }
+
     public function testSerialiseTable()
     {
         $table = $this->_table['products'];