Migrasi Database Phalcon

Migrasi adalah cara mudah bagi Anda untuk mengubah database Anda dengan cara yang terstruktur dan terorganisir.

Penting: Migrasi yang tersedia di Phalcon Developer Tools. Anda memerlukan setidaknya Phalcon Framework versi 0.5.0 untuk menggunakan developer tools. Juga dianjurkan untuk memiliki PHP 5.3.11 atau lebih.

Seringkali dalam pengembangan kita perlu melakukan perubahan dalam environment produksi (penerapan aplikasi). Beberapa perubahan ini diantaranya modifikasi database seperti kolom baru, tabel baru, menghapus indeks, dll.

Ketika migrasi dibuat, satu set class diciptakan untuk menggambarkan bagaimana struktur database Anda pada saat itu. Class-class ini dapat digunakan untuk menyinkronkan skema struktur pada database remote (server lain),  untuk mengatur database agar sesuai dengan update aplikasi Anda. Migrasi menggambarkan transformasi ini menggunakan Plain-PHP.

Skema Dumping 

Phalcon Developer Tools menyediakan script untuk mengelola migrasi (generate, run dan rollback).

Pilihan yang tersedia untuk menghasilkan migrasi adalah:

../_images/migrations-1.png

Menjalankan script ini tanpa parameter apapun akan memberikan dump setiap objek (tabel dan view) dari database Anda di class migrasi.

Setiap migrasi memiliki versi sbg identitas. Nomor versi memungkinkan kita untuk mengidentifikasi apakah migrasi yang lebih baru atau lebih tua dari ‘versi’ database kita saat ini. Versi juga menginformasikan Phalcon dari menjalankan perintah ketika menjalankan migrasi.

../_images/migrations-2.png

Ketika migrasi di-generate, instruksi ditampilkan pada konsol untuk menjelaskan langkah-langkah perubahan dari migrasi dan waktu eksekusinya. Pada akhirnya, versi migrasi dihasilkan.

Secara default Phalcon Developer Tools menggunakan direktori app/migrations untuk menyimpan file migrasi. Anda dapat mengubah lokasi dengan memberikan parameter saat di-generate. Setiap tabel dalam database dibuatkan class masing-masing yg dihasilkan dalam file terpisah di bawah direktori dgn nama sesuai versi migrasi:

../_images/migrations-3.png

Anatomi Class Migrasi  

Setiap file berisi kelas yang unik extend dr Phalcon\MVC\Model\Migration, Kelas-kelas ini biasanya memiliki dua metode: up() dan down(). Up() melakukan migrasi, sementara down() melakukan rollback.

Up() juga berisi metode magic morphTable(). Istimewanya, ia mengenali perubahan yang diperlukan untuk menyinkronkan tabel yang sebenarnya dalam database sesuai deskripsi yang diberikan.

<?php

use Phalcon\Db\Column as Column;
use Phalcon\Db\Index as Index;
use Phalcon\Db\Reference as Reference;

class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
{

    public function up()
    {
        $this->morphTable(
            "products",
            array(
                "columns" => array(
                    new Column(
                        "id",
                        array(
                            "type"          => Column::TYPE_INTEGER,
                            "size"          => 10,
                            "unsigned"      => true,
                            "notNull"       => true,
                            "autoIncrement" => true,
                            "first"         => true,
                        )
                    ),
                    new Column(
                        "product_types_id",
                        array(
                            "type"     => Column::TYPE_INTEGER,
                            "size"     => 10,
                            "unsigned" => true,
                            "notNull"  => true,
                            "after"    => "id",
                        )
                    ),
                    new Column(
                        "name",
                        array(
                            "type"    => Column::TYPE_VARCHAR,
                            "size"    => 70,
                            "notNull" => true,
                            "after"   => "product_types_id",
                        )
                    ),
                    new Column(
                        "price",
                        array(
                            "type"    => Column::TYPE_DECIMAL,
                            "size"    => 16,
                            "scale"   => 2,
                            "notNull" => true,
                            "after"   => "name",
                        )
                    ),
                ),
                "indexes" => array(
                    new Index(
                        "PRIMARY",
                        array("id")
                    ),
                    new Index(
                        "product_types_id",
                        array("product_types_id")
                    )
                ),
                "references" => array(
                    new Reference(
                        "products_ibfk_1",
                        array(
                            "referencedSchema"  => "invo",
                            "referencedTable"   => "product_types",
                            "columns"           => array("product_types_id"),
                            "referencedColumns" => array("id"),
                        )
                    )
                ),
                "options" => array(
                    "TABLE_TYPE"      => "BASE TABLE",
                    "ENGINE"          => "InnoDB",
                    "TABLE_COLLATION" => "utf8_general_ci",
                )
            )
        );
    }

}

Kelas ini disebut “ProductsMigration_100”. Akhiran 100 mengacu pada versi 1.0.0. morphTable() menerima sebuah array asosiatif dengan 4 kemungkinan:

Indeks Deskripsi Opsional
“columns” Sebuah array dengan satu set kolom tabel Tidak
“indexes” Sebuah array dengan satu set indeks tabel. Ya
“references” Sebuah array dengan satu set referensi tabel (kunci asing). Ya
“options” Sebuah array dengan satu set pilihan pembuatan tabel. Pilihan ini sering berkaitan dengan sistem database di mana migrasi itu dihasilkan. Ya

Mendefinisikan Kolom 

Phalcon \ Db \ Column digunakan untuk menentukan kolom tabel. Class merangkum berbagai fitur kolom. Konstruktor menerima parameter pertama nama kolom dan sebuah array sbg deskripsi kolom. Berikut adalah pilihan yang tersedia dalam deskripsi kolom:

Pilihan Deskripsi Opsional
“type” Jenis kolom. Harus Phalcon_Db_Column konstan (lihat di bawah) Tidak
“size” Beberapa jenis kolom seperti VARCHAR atau INTEGER mungkin memiliki ukuran tertentu Ya
“scale” Kolom DECIMAL atau NUMBER mungkin memiliki skala untuk menentukan berapa banyak desimal harus menyimpan Ya
“unsigned” Kolom INTEGER dapat ditandatangani atau unsigned.Opsi ini tidak berlaku untuk jenis lain dari kolom Ya
“NotNull” Kolom dapat menyimpan nilai null? Ya
“Autoincrement” Dengan kolom atribut ini akan diisi secara otomatis dengan auto-increment integer. Hanya satu kolom dalam tabel dapat memiliki atribut ini. Ya
“first” Kolom harus ditempatkan pada posisi pertama dalam urutan kolom Ya
“after” Kolom harus ditempatkan setelah kolom yang disebutkan Ya

Migrasi database mendukung jenis kolom database berikut:

  • Phalcon \ Db \ Column :: TYPE_INTEGER
  • Phalcon \ Db \ Column :: TYPE_DATE
  • Phalcon \ Db \ Column :: TYPE_VARCHAR
  • Phalcon \ Db \ Column :: TYPE_DECIMAL
  • Phalcon \ Db \ Column :: TYPE_DATETIME
  • Phalcon \ Db \ Column :: TYPE_CHAR
  • Phalcon \ Db \ Column :: TYPE_TEXT

Mendefinisikan Indeks 

Phalcon \ Db \ Index mendefinisikan indeks tabel. Indeks hanya mengharuskan Anda menentukan nama dan daftar kolom-kolomnya. Perhatikan bahwa jika indeks diberi nama “PRIMARY”, maka Phalcon akan diatur sbg indeks primary-key dalam tabel tersebut.

Mendefinisikan Referensi 

Phalcon \ Db \ Reference mendefinisikan referensi tabel (juga disebut foreign key). Opsi berikut dapat digunakan untuk menentukan referensi:

Indeks Deskripsi Opsional
“ReferencedTable” Ini auto-deskriptif. Hal ini mengacu pada nama tabel yang direferensikan. Tidak
“column” Sebuah array dengan nama kolom di meja yang memiliki referensi Tidak
“ReferencedColumns” Sebuah array dengan nama kolom di tabel yang direferensikan Tidak
“referencedSchema” Tabel direferensikan mungkin adalah pada skema lain atau database. Pilihan ini memungkinkan Anda untuk menentukan itu. Ya

Menulis Migrasi 

Migrasi tidak hanya dirancang untuk “morph” table. Migrasi hanya sebuah kelas PHP biasa sehingga Anda tidak terbatas pada fungsi tersebut. Misalnya setelah menambahkan kolom Anda bisa menulis kode untuk mengatur nilai kolom tersebut untuk record yang telah ada. Untuk rincian lebih lanjut dan contoh metodenya, periksa referensi komponen database .

<?php

class ProductsMigration_100 extends \Phalcon\Mvc\Model\Migration
{

    public function up()
    {
        //...
        self::$_connection->insert(
            "products",
            array("Malabar spinach", 14.50),
            array("name", "price")
        );
    }

}

Menjalankan Migrasi 

Setelah migrasi yang dihasilkan di-upload pada server target, Anda dapat dengan mudah menjalankannya seperti yang ditunjukkan dalam contoh berikut:

../_images/migrations-4.png
../_images/migrations-5.png

Tergantung pada selisih versi database dengan migrasi, Phalcon dapat menjalankan beberapa versi migrasi dalam proses migrasi yang sama. Jika Anda menyebutkan versi yg diinginkan, Phalcon akan menjalankan migrasi yang dibutuhkan hingga mencapai versi tersebut.

Terjemahan dr Database Migration Phalcon
http://docs.phalconphp.com/en/latest/reference/migrations.html