Ladder

A (deprecated) PHP database migration tool.

Examples

Simple Table Creation

<?php

class Users_Migration_00001 extends Migration {
    
// When using `php ladder.php create <migration_name>`, this is automatically added.
    
protected $min_version '0.7.1';
    
    public function 
up() {
        
/**
         * Create the users table (or add columns if it already exists).
         * An 'id' auto increment field is automatically added when creating a table,
         * but may be overridden.
         */
        
$this->table('users')
            ->
column('username''varchar', array('limit' => 50'null' => FALSE))
            ->
column('password_hash''char', array('limit' => 64'null' => FALSE))
        ;
    }
    
    public function 
down() {
        
// Drop the table when this migration is removed.
        
$this->table('users')->drop();
    }
    
}

Advanced Usage

<?php

class Advanced_Migration_00002 extends Migration {
    
// When using `php ladder.php create <migration_name>`, this is automatically added.
    
protected $min_version '0.7.1';

    
// Which databases to apply this migration to, useful for multi-database setups.
    // protected $databases = FALSE;

    // Name any files that should be imported after up() has run.
    // protected $import_data = array();

    // Should we generate UPDATE queries when importing?
    // protected $import_update = FALSE; // TRUE for all, or array of tables from import_data to update.

    // When import_update == TRUE, what fields should be used in the WHERE clause of the UPDATE?
    // protected $import_key_fields = FALSE; // Array of 'table' => array('fields', 'for', 'where').

    // When down() is run, should we "unimport" the data?
    // protected $unimport_data = TRUE; // or an array of tables to unimport.

    // Which fields to use in the DELETE query's WHERE clause.
    // protected $unimport_key_fields = FALSE; // or an array of table => array(key, fields).
    
    
public function up() {
        
$this->table('users')
            ->
column('email''varchar', array('limit' => 128)) // Nullable by default.
            
->execute() // Run this part immediately.
        
;
        
        
// Update the table data.
        
$this->db->query('UPDATE users SET email = username;');
        
        
// Remove the column.
        
$this->table('users')
            ->
drop_column('username')
        ;
        
        
// Insert a new record, and record its id.
        
$insert_id $this->table('users')
            ->
insert(array(
                
'email' => 'example@example.tld',
                
'password' => NULL,
            ))
            ->
insert_id
        
;
        
        
// Store the user id for later.
        
$this->set('created_user_id'$insert_id);
    }
    
    public function 
down() {
        
// Get a reference to the users table.
        
$users $this->table('users');
        
        
// Remove the inserted user.
        
if ((bool) $user_id $this->get('created_user_id')) {
            
$this->table('users')->delete(array(
                
'id' => (int) $user_id,
            ));
        }
        
        
// Add the column back in, nullable.
        
$users
            
->column('username''varchar', array('limit' => 50))
            ->
execute() // Force immediate execution.
        
;
        
        
// Update data.
        
$this->db->query('UPDATE users SET username = email;');
        
        
// Remove column, and disallow NULLs in the username field.
        
$users
            
->drop_column('email')
            ->
alter_column('username''varchar', array('limit' => 50'null' => FALSE))
        ;
    }
}

Further Usage

<?php

class Further_Migration_00003 extends Migration {
    public function 
up() {
        
// Add column, update and delete some data, then remove the old column, and make the new on
        
$this->table('posts')
            ->
column('user_id''integer', array('null' => false'default' => 0))
            ->
update(
                array(
'user_id' => 1),
                array(
'username' => 'admin')
            )
            ->
delete(array(
                
'username IN (SELECT username FROM banned_users)',
                
'user_level != \'admin\'',
            ))
            ->
drop_column('username')
        ;
    }

    public function 
down() {
        
$this->table('posts')
            ->
column('username''varchar', array('limit' => 50'null' => FALSE))
            ->
update(
                array(
'username' => 'admin')
                array(
'user_id' => 1),
            )
            ->
drop_column('user_id')
        ;
    }
}

Query Usage

<?php

class Using_Queries_00004 extends Migration {
    public function 
up() {
        
/** @var LadderDB_Result $query */
        
$query $this->db->query('SELECT * FROM posts');

        
// LadderDB_Result->fetch() / LadderDB_Result->fetch_assoc()
        // LadderDB_Result->fetch_array()
        // LadderDB_Result->fetch_object()
        // LadderDB_Result->fetch_row()

        // LadderDB_Result->num_rows();

        
while ($row $query->fetch()) {
            
// Do stuff here!
        
}
    }

    public function 
down() {
    }
}