public function migrateDown( $levels = NULL )
    {
        if ( NULL !== $levels )
        {
            $this->levels = $levels;
        }
        
        $migrations = $this->getAppliedMigrations( );
        
        $i = 0;
        
        if ( self::MIGRATE_ALL === $this->levels || $this->levels > count( $migrations ) )
        {
            $this->levels = count( $migrations );
        }
        
        while ( $i < $this->levels )
        {
            $class = $migrations[ $i ];
            
            $migration = new $class( );
            
            $method = new \ReflectionMethod( $class, 'migrateDown' );
            
            // run migrateDown
            if ( $class === $method->getDeclaringClass( )->name )
            {
                $migration->migrateDown( $this->db );
                
                // delete migration from table
                if ( FALSE === $this->_deleteMigrationRecord( $class ) )
                {
                    throw new MigrationException( 'Failed to delete migration record: ' . $class );
                }
            }
            else // run safeMigrateDown
            {
                $method = new \ReflectionMethod( $class, 'safeMigrateDown' );
            
                if ( $class === $method->getDeclaringClass( )->name )
                {
                    try
                    {
                        // start transaction
                        $this->db->startTransaction( );

                        // turn off auto commit
                        $this->db->setTransactionAutocommit( FALSE );

                        // run safeMigrateDown
                        $migration->safeMigrateDown( $this->db );

                        // delete migration record
                        if ( FALSE === $this->_deleteMigrationRecord( $class ) )
                        {
                            throw new MigrationException( 
                                    'Failed to delete migration record: ' . $class );
                            
                            $this->db->rollbackTransaction();
                        }

                        // commit transaction
                        $this->db->commitTransaction( );
                    }
                    catch ( \Exception $e )
                    {
                        // rollback transaction
                        $this->db->rollbackTransaction( );

                        throw $e;
                    }
                }
            }
            
            $i++;
            
            if ( $this->levels === $i )
            {
                $this->doAction( self::ON_MIGRATE_DOWN_ACTION );
                
                return;
            }
        }
    }
public function migrateDown( $levels = NULL )
    {
        if ( NULL !== $levels )
        {
            $this->levels = $levels;
        }
        
        $migrations = $this->getAppliedMigrations( );
        
        $i = 0;
        
        if ( self::MIGRATE_ALL === $this->levels || $this->levels > count( $migrations ) )
        {
            $this->levels = count( $migrations );
        }
        
        while ( $i < $this->levels )
        {
            $class = $migrations[ $i ];
            
            $migration = new $class( );
            
            $method = new \ReflectionMethod( $class, 'migrateDown' );
            
            // run migrateDown
            if ( $class === $method->getDeclaringClass( )->name )
            {
                $migration->migrateDown( $this->db );
                
                // delete migration from table
                if ( FALSE === $this->_deleteMigrationRecord( $class ) )
                {
                    throw new MigrationException( 'Failed to delete migration record: ' . $class );
                }
            }
            else // run safeMigrateDown
            {
                $method = new \ReflectionMethod( $class, 'safeMigrateDown' );
            
                if ( $class === $method->getDeclaringClass( )->name )
                {
                    try
                    {
                        // start transaction
                        $this->db->startTransaction( );

                        // turn off auto commit
                        $this->db->setTransactionAutocommit( FALSE );

                        // run safeMigrateDown
                        $migration->safeMigrateDown( $this->db );

                        // delete migration record
                        if ( FALSE === $this->_deleteMigrationRecord( $class ) )
                        {
                            throw new MigrationException( 
                                    'Failed to delete migration record: ' . $class );
                            
                            $this->db->rollbackTransaction();
                        }

                        // commit transaction
                        $this->db->commitTransaction( );
                    }
                    catch ( \Exception $e )
                    {
                        // rollback transaction
                        $this->db->rollbackTransaction( );

                        throw $e;
                    }
                }
            }
            
            $i++;
            
            if ( $this->levels === $i )
            {
                $this->doAction( self::ON_MIGRATE_DOWN_ACTION );
                
                return;
            }
        }
    }
public function migrateDown ( $ levels = NULL ) { if ( NULL !== $ levels ) { $ this -> levels = $ levels ; } $ migrations = $ this -> getAppliedMigrations ( ) ; $ i = 0 ; if ( self :: MIGRATE_ALL === $ this -> levels || $ this -> levels > count ( $ migrations ) ) { $ this -> levels = count ( $ migrations ) ; } while ( $ i < $ this -> levels ) { $ class = $ migrations [ $ i ] ; $ migration = new $ class ( ) ; $ method = new \ ReflectionMethod ( $ class , 'migrateDown' ) ; // run migrateDown if ( $ class === $ method -> getDeclaringClass ( ) -> name ) { $ migration -> migrateDown ( $ this -> db ) ; // delete migration from table if ( FALSE === $ this -> _deleteMigrationRecord ( $ class ) ) { throw new MigrationException ( 'Failed to delete migration record: ' . $ class ) ; } } else // run safeMigrateDown { $ method = new \ ReflectionMethod ( $ class , 'safeMigrateDown' ) ; if ( $ class === $ method -> getDeclaringClass ( ) -> name ) { try { // start transaction $ this -> db -> startTransaction ( ) ; // turn off auto commit $ this -> db -> setTransactionAutocommit ( FALSE ) ; // run safeMigrateDown $ migration -> safeMigrateDown ( $ this -> db ) ; // delete migration record if ( FALSE === $ this -> _deleteMigrationRecord ( $ class ) ) { throw new MigrationException ( 'Failed to delete migration record: ' . $ class ) ; $ this -> db -> rollbackTransaction ( ) ; } // commit transaction $ this -> db -> commitTransaction ( ) ; } catch ( \ Exception $ e ) { // rollback transaction $ this -> db -> rollbackTransaction ( ) ; throw $ e ; } } } $ i ++ ; if ( $ this -> levels === $ i ) { $ this -> doAction ( self :: ON_MIGRATE_DOWN_ACTION ) ; return ; } } }
Runs the DOWN migration.

@param mixed $levels optional migration levels size

@action ON_MIGRATE_DOWN_ACTION

@throws MigrationException on failed transaction
Runs the DOWN migration .