What is Migration?
Why migration is needed?
Some below advantages are available for use migrations.
Setting Up Migration In CodeIgniter
In order to work with migration, developers need to configure CodeIgniter. Currently, we assume that they have configured the application.
Now Open the application/config/migration.php file
In file, developers will see the $config[‘migration_enabled’] with value False. Set it TRUE. For Securities, reason set False, if no longer use Migration.
In file, developers will also see the $config[‘migration_type’] with set ‘timestamp’. Developers set two different migration types when they create migration.
Sequential: Sequential migration naming (001_add_user.php) Timestamp: Timestamp migration naming (20121031104401_add_user.php)
Note: Create a migration file as per the selected type in the migration file. If developers selected timestamp and created migration file with Sequential number, Migration file execute but a table will not create in the database.
Actually migration history maintains in a database table with the last migration. By default, the migration table is Migrations. A developer can change the migration table name. If developers want to modify the table name they can modify the $config[‘migration_table’] value. E.g. if developers want to change the migration table name ‘ Migrate’ then they need to set as below;
$config['migration_table'] = 'Migrate';
$config[‘migration_auto_latest’] defines the framework to update the migration to the latest version.
Also, developers can modify the migration file path as they want. If developers want to modify the migration path, then they need to modify the $config[‘migration_path’] parameter. By default, $config[‘migration_path’] Path is APPPATH.’migrations/’.
Create a folder called migrations in the application/ folder.
Create Migration With Example
We will create table ‘users’ that contains the following fields: ‘sr_no’,’name’,’email’
I have set up below values in application/config/migration.php file
$config['migration_enabled'] = TRUE; $config['migration_type'] = 'sequential'; $config['migration_table'] = 'Migrations'; $config['migration_path'] = APPPATH.'migrations/';
As above mentions migration type ‘sequential’, we create “001_create_user.php” file inside the “application/migrations”.
In the migrations folder, we can create our database changes files. Let’s we want to create the ‘users’ table. So create a file with the name ‘001_create_user.php’ and open file write basic code for migrations.
defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_create_users extends CI_Migration { public function up() { } public function down() { } ?>
As developers can see, the class name must start with ‘Migration_’ and attach with string ‘create_user’.
Every migration has two class methods: an up() method and a down() method. The up() method to tell our application want to create when migration is run. The down() method to tell our application if we want to undo the particular migration.
In our case, if we run migration the up() method to create the ‘users’ table. If we want to undo the migration, down() method delete the ‘users’ table for us.
Forge Class
The Database Forge class used to manage the database operations such like create table, delete table, rename the table field name. Now we create the construct method inside the migration file.
defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_create_users extends CI_Migration { public function __construct() { parent::__construct(); $this->load->dbforge(); } public function up() { } public function down() { } ?>
up() method
As above mentioned before, the up() method used when we want to run migration. Now we define code in up() method.
defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_create_users extends CI_Migration { public function __construct() { parent::__construct(); $this->load->dbforge(); } public function up() { $fields = array ( 'sr_no' => array( 'type' => 'INT', 'constraint' => 11, 'auto_increment' => TRUE ), 'name' => array( 'type' => 'VARCHAR', 'constraint' => 60 ), 'email' => array( 'type' => 'VARCHAR', 'constraint' => 255 ) ); } public function down() { } ?>
As below, now we simply assign dbforge the field by add_field() method.
$this->dbforge->add_field($fields);
As we want to ‘sr_no’ as primary key, So we want to assign field by add_key() method.
this->dbforge->add_key(‘sr_no’,TRUE);
As we want to create table ‘users; , So we want to assign dbforge the field by create_table() method.
$this->dbforge->create_table('users',TRUE);
down() method
As above mentioned before, the down() method used when we want to undo the migration. Now we define code in down() method.
$this->dbforge->drop_table('users', TRUE);
Now we will see the migration file
defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_create_users extends CI_Migration { public function __construct() { parent::__construct(); $this->load->dbforge(); } public function up() { $fields = array ( 'sr_no' => array( 'type' => 'INT', 'constraint' => 11, 'auto_increment' => TRUE ), 'name' => array( 'type' => 'VARCHAR', 'constraint' => 60 ), 'email' => array( 'type' => 'VARCHAR', 'constraint' => 255 ) ); $this->dbforge->add_field($fields); this->dbforge->add_key(‘sr_no’,TRUE); $this->dbforge->create_table('users',TRUE); } public function down() { $this->dbforge->drop_table('users', TRUE); } ?>
Controller Class
We have created the migration file. Now for executing the migration file, we need to create a controller file in ‘application/controllers’ folder. So create file with name ‘Migration.php’
class Migrate extends CI_Controller { public function index() { echo ‘Controller file index method run.’; } public function CreateMigration($version = NULL) { $this->load->library(‘migration’); if(isset($version) && ($this->migration->version($version) === FALSE)) { show_error($this->migration->error_string()); } elseif(is_null($version) && $this->migration->latest() === FALSE) { show_error($this->migration->error_string()); } else { echo ‘The migration file has executed successfully.’; } } public function undoMigration($version = NULL) { $this->load->library(‘migration’); $migrations = $this->migration->find_migrations(); $migrationKeys = array(); foreach($migrations as $key => $migration) { $migrationKeys[] = $key; } if(isset($version) && array_key_exists($version,$migrations) && $this->migration->version($version)) { echo ‘The migration was undo’; exit; } elseif(isset($version) && !array_key_exists($version,$migrations)) { echo ‘The migration with selected version doesn’t exist.’; } else { $penultimate = (sizeof($migrationKeys)==1) ? 0 : $migrationKeys[sizeof($migrationKeys) – 2]; if($this->migration->version($penultimate)) { echo ‘The migration has been reverted successfully.’; exit; } else { echo ‘Couldn\’t roll back the migration.’; exit; } } } public function resetMigration() { $this->load->library(‘migration’); if($this->migration->current()!== FALSE) { echo ‘The migration was revert to the version set in the config file.’; return TRUE; } else { echo ‘Couldn\’t reset migration.’; show_error($this->migration->error_string()); exit; } } }
As above, developers can see we have created three methods : CreateMigration(), undoMigration() and resetMigration(). Using CreateMigration() method, accept the parameter that in our case we have set the ‘sequential‘. If developers pass the ‘sequential’ number, Codeignter will call that version of the file in migration. Using undoMigration() method and resetMigration() method that will reset migration to the set in file $config[‘migration_version’].
Route File
We have created the migration and controller files to executing the migration. Now for define the route path in route.php file. “application/config”
$route['MigrationIndex'] = 'Migrate/index'; $route['createMigration'] = 'Migrate/CreateMigration; $route['undoMigration'] = 'Migrate/undoMigration; $route['resetMigration'] = 'Migrate/resetMigration;
If developers execute the MigrationIndex in the browser output will show as below
Controller file index method run
If developers execute the createMigration in the browser output will show as below and two tables will create in database: ‘Migrations‘ and ‘users
The migration file has executed successfully.
If developers execute the undoMigration in the browser output will show as below and delete the ‘users’ table from the database.
The migration was undo.
Are multiple developers are working on your CodeIgniter project and facing issues while altering the database? we have a solution for you as Migration functionality in the CodeIgniter project. We have expertise in implementing Migration function, contact our expert OneClick team.