Panduan Migrasi Database Menggunakan PHP Phinx

Migrasi bisa diatrikan berpindah ke platform yang satu ke platform yang lain.
Dalam pengembangan web migrasi adalah hal yang wajib dilakukan.
Misalnya:
Saat aplikasi web sudah jadi dan siap untuk di-hosting, apa yang akan kita lakukan berikutnya?
Ya jelas, kita akan melakukan migrasi (deployment) dari lingkungan localhost ke server production/hosting.
Biasanya migrasi secara tradisional dilakukan dengan:
- Ekspor database;
- Upload proyek ke server production (hosting);
- Impor database ke server production.
Tapi masalahnya…
“Bagaimana kalau database yang digunakan di server hosting berbeda dengan database lokal?”
Misalnya pada saat pengembangan di localhost, kita menggunakan MySQL. Sedangkan di server hosting menggunakan PostgerSQL.
Kita bisa saja mengubah hasil ekspor (dump) dari MySQL ke PostgerSQL.
“Lalu, bagaimana kalau sudah ada data di dalam server hosting?”
Nah ini perlu dipikirkan lagi… Kerja lagi 😠.
Oleh sebab itu, kita disarankan menggunakan database migration tools agar kita tidak repot dalam mengurus migrasi database.
Beberapa framework seperti Yii dan Laravel sudah menyediakan tool tersendiri untuk migrasi database.
Bila proyekmu menggunakan PHP Native, kamu bisa menggunakan beberapa tools seperti Phinx.
Pada panduan ini kita akan belajar menggunakan Phinx, yang merupakan salah satu tools migrasi database terpopuler untuk PHP.
Apa itu Phinx?
Phinx adalah tool migrasi database berbasis PHP yang dibuat oleh Rob Morgan.
Phinx akan membantu kita memanipulasi database dengan mudah, sehingga kita tidak lagi menulis skema SQL secara manual.
Saat tulisan ini dibuat, Phinx masih versi 0.8.0.
Instalasi Phinx ke dalam Proyek
Phinx dapat kita instal melalui composer.
Sebelumnya kita persiapkan dulu proyeknya.
Silakan buat direktori baru bernama my-php-project:
mkdir my-php-project
cd my-php-projectSetelah itu install Phinx melalui composer:
composer require robmorgan/phinx --devTunggulah beberapa saat, Phinx akan segera terinstal.
Kenapa kita menggunakan --dev?
Pertanyaan bagus.
Karena Phinx hanya akan kita gunakan untuk development saja, Phinx tidak akan digunakan oleh aplikasi di lingkungan production.
Setelah Phinx berhasil terinstal, akan ada file composer.json, composer.lock,
dan direktori vendor.
{
"require-dev": {
"robmorgan/phinx": "^0.8.1"
}
}Menyiapkan Phinx
Phinx membutuhkan direktori db untuk menyimpan skrip migrasinya.
Silakan buat direktori baru:
mkdir -p db/{migrations,seeds}Maka akan terbuat struktur direktori seperti ini:
db
├── migrations
└── seedsDirektori migrations digunakan untuk menyimpan skema migrasi, sedangkan
seeds digunakan untuk menyimpan bibit data.
Langkah selanjutnya adalah mengeksekusi file binary Phinx
yang berada di vendor/bin/phinx.
Kita akan selalu mengeksekusi file tersebut setiap kali kita melakukan migrasi.
Pertama, silakan persiapkan Phinx dengan perintah berikut ini:
php vendor/bin/phinx initPerintah tersebut akan membuat file baru bernama phinx.yml yang
berisi konfigurasi Phinx.
paths:
migrations: %%PHINX_CONFIG_DIR%%/db/migrations
seeds: %%PHINX_CONFIG_DIR%%/db/seeds
environments:
default_migration_table: phinxlog
default_database: development
production:
adapter: mysql
host: localhost
name: production_db
user: root
pass: ''
port: 3306
charset: utf8
development:
adapter: mysql
host: localhost
name: development_db
user: root
pass: ''
port: 3306
charset: utf8
testing:
adapter: mysql
host: localhost
name: testing_db
user: root
pass: ''
port: 3306
charset: utf8
version_order: creationPada file tersebut berisi konfigurasi direktori dan koneksi database yang akan digunakan oleh Phinx.
Lokasi file migrasi Phinx:
paths:
migrations: %%PHINX_CONFIG_DIR%%/db/migrations
seeds: %%PHINX_CONFIG_DIR%%/db/seedsAda tiga Environment dalam konfigurasi Phinx:
productionuntuk server hosting.developmentuntuk server lokal (localhost).testinguntuk server testing.
Untuk saat ini kita gunakan yang development saja.
Silakan buat database baru.

Setelah itu, ubah konfigurasinya sesuai dengan nama database-nya.
paths:
migrations: %%PHINX_CONFIG_DIR%%/db/migrations
seeds: %%PHINX_CONFIG_DIR%%/db/seeds
environments:
default_migration_table: phinxlog
default_database: development
production:
adapter: mysql
host: localhost
name: production_db
user: root
pass: ''
port: 3306
charset: utf8
development:
adapter: mysql
host: localhost
name: my_php_project
user: root
pass: 'kopi'
port: 3306
charset: utf8
testing:
adapter: mysql
host: localhost
name: testing_db
user: root
pass: ''
port: 3306
charset: utf8
version_order: creationSetelah itu, silakan lakukan verifikasi konfigurasi dengan perintah:
vendor/bin/phinx testApabila hasilnya sukses, berarti konfigurasi kita benar.

Membuat Kode Migrasi
Selanjutnya kita akan menulis kode migrasi.
Silakan buat migrasi dengan perintah:
vendor/bin/phinx create UserArtinya, kita akan membuat migrasi untuk tabel User.
Pastikan menggunakan huruf besar di awalnya, karena akan digunakan sebagai nama class pada kode migrasi.

Setelah berhasil mengeksekusi perintah tersebut, akan ada file
baru di direktori db/migrations.
<?php
use Phinx\Migration\AbstractMigration;
class User extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
}
}Terdapat method change() di dalam class User,
di sana lah kita akan menulis kode migrasi.
Selain itu ada juga method up() dan down().
Apa fungsinya?
- Method
up()akan dieksekusi ketika kita melakukan migrasi ke server (membuat tabel). - Method
down()akan dieksekusi saat kita melakukan rollback (menghancurkan tabel). - Method
change()kedua-duanya, ketika migrasi dan rollback.
Untuk memahaminya, mari kita coba membuat migrasi pertama.
Silakan ubah kode di atas menjadi seperti ini:
<?php
use Phinx\Migration\AbstractMigration;
class User extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
// buat tabel bernama 'users'
$users = $this->table('users', array('id' => 'id_user'));
// buat kolom-kolom untuk users
$users->addColumn('username', 'string', ['limit' => 64])
->addColumn('name', 'string', ['limit' => 64])
->addColumn('email', 'string', ['limit' => 64])
->addColumn('password','string', ['limit' => 255])
->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])
->create();
}
}Silakan simpan dan selanjutnya kita akan melakukan migrasi.
Perintah Phinx untuk Migrasi
Setelah kita menulis kode migrasi, selanjutnya kita bisa melakukan migrasi dengan perintah:
phinx migrate -e developmentUntuk migrasi ke server development.

Migrasi pertama kita berhasil, silakan cek di database…
Sekarang sudah ada tabel User.

Pada perintah migrasi di atas, kita menggunakan argumen -e development
untuk menentukan ke mana kita akan migrasi.
Kalau kita ingin migrasi ke server production berarti kita harus
menggunakan -e production.
Silakan juga melihat opsi argumen yang lainnya dengan perintah:
$ vendor/bin/phinx migrate --help
Usage:
migrate [options]
Options:
-c, --configuration=CONFIGURATION The configuration file to load
-p, --parser=PARSER Parser used to read the config file. Defaults to YAML
-e, --environment=ENVIRONMENT The target environment
-t, --target=TARGET The version number to migrate to
-d, --date=DATE The date to migrate to
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
The migrate command runs all available migrations, optionally up to a specific version
phinx migrate -e development
phinx migrate -e development -t 20110103081132
phinx migrate -e development -d 20110103
phinx migrate -e development -vUntuk membatalkan migrasi yang baru saja kita lakukan, kita bisa gunakan perintah:
vendor/bin/phinx rollback -e developmentUpdate Perubahan Migrasi
Ada kalanya setelah melakukan migrasi, kita ingin mengubah beberapa skema database.
Misalkan, kita ingin menambahkan kolom address pada tabel users…
Maka kita bisa membuat lagi kode migrasinya.
vendor/bin/phinx create AddUserAddressLalu mengisi kode migrasinya:
<?php
use Phinx\Migration\AbstractMigration;
class AddUserAddress extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
// pilih tabel 'users'
$users = $this->table('users');
// tambahkan kolom 'address'
$users->addColumn('address', 'string', ['limit' => 64]);
$users->update();
}
}Setelah itu, eksekusi lagi perintah migrasinya:
vendor/bin/phinx migrate -e developmentMaka tabel users akan diupdate…
Membuat Bibit Data (Seeds)
Seeds adalah data awal yang akan kita masukkan ke database.
Cara membuat seeds bisa dilakukan dengan perintah ini:
vendor/bin/phinx seed:create <NamaSeed>Contoh:
vendor/bin/phinx seed:create UsersMaka akan tercipta file baru di dalam direktori db/seeds.
<?php
use Phinx\Seed\AbstractSeed;
class Users extends AbstractSeed
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run()
{
}
}Di dalam kode tersebut terdapat method run().
Method tersebut akan dieksekusi saat kita mengirim seeds
ke database.
Maka kita harus menuliskan seeds datanya di sana.
Contoh, kita buat tiga bibit data:
<?php
use Phinx\Seed\AbstractSeed;
class Users extends AbstractSeed
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run()
{
$data = array(
array(
'username' => 'ardianta',
'name' => 'Ardianta',
'email' => 'ardianta@petanikode.com',
'address' => 'Lombok',
'password' => password_hash('kopi', PASSWORD_DEFAULT)
),
array(
'username' => 'admin',
'name' => 'Admin',
'email' => 'info@petanikode.com',
'address' => 'Mataram',
'password' => password_hash("admin", PASSWORD_DEFAULT)
),
array(
'username' => 'petanikode',
'name' => 'Petani Kode',
'email' => 'petani@petanikode.com',
'address' => 'Internet',
'password' => password_hash("admin", PASSWORD_DEFAULT)
)
);
$user = $this->table('users');
$user->insert($data)->save();
}
}Setelah itu silakan eksekusi perintah berikut untuk mengirim bibit datanya ke database:
vendor/bin/phinx seed:runApabila berhasil, akan ada data di dalam tabel users.

Apa Selanjutnya?
Kita sudah belajar dasar-dasar migrasi database menggunakan Phinx.
Selanjutnya untuk migrasi yang lebih rumit, bisa kamu pelajari di dokumentasi Phinx.