Code Factory | Selama proses pengembangan aplikasi database, struktur database yang digunakan juga ikut berubah dan berkembang seperti halnya kode sumber (source code) aplikasi kita. Misalnya, membuat tabel baru, menambahkan kolom baru, menambahkan indeks untuk meningkatkan kinerja query, dan sebagainya. Karena perubahan struktur database sering membutuhkan beberapa perubahan kode sumber, Yii menyediakan fitur migrasi database yang memungkinkan Anda untuk melacak perubahan database, melakukan upgrade struktur database, atau downgrade struktur database jika diperlukan. Referensi lengkap tentang migrasi database di Yii bisa dilihat di laman ini.
Code Factory | Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel ini merupakan lanjutan dari artikel pertama tentang Cara Instalasi Yii Framework. Aplikasi yang akan kita bangun sederhana saja sehingga cukup mudah dipahami para programmer pemula.
Migrasi Database (Database Migration)
Selama proses pengembangan aplikasi database, struktur database yang digunakan juga ikut berubah dan berkembang seperti halnya kode sumber (source code) aplikasi kita. Misalnya, membuat tabel baru, menambahkan kolom baru, menambahkan indeks untuk meningkatkan kinerja query, dan sebagainya. Karena perubahan struktur database sering membutuhkan beberapa perubahan kode sumber, Yii menyediakan fitur migrasi database yang memungkinkan Anda untuk melacak perubahan database, melakukan upgrade struktur database, atau downgrade struktur database jika diperlukan. Referensi lengkap tentang migrasi database di Yii bisa dilihat di laman ini.
Untuk memulai menggunakan fitur migration di Yii, pastikan kita sudah membuat forlder migrations di dalam folder framework yii kita. Sesuai dengan desain database yang sudah kita buat sebelumnya, maka kita perlu membuat migrasi untuk 4 (empat) buat tabel, yaitu items, transaction_types, transactions, dan transaction_details.
Jalankan perintah berikut untuk membuat migrasi table items.
yii migrate/create create_table_items
Yii kemudian akan menanyakan apakah kita benar akan membuat migrasi, jawablah dengan yes.
Setelah itu, buka folder migrations maka kamu akan melihat sebuah file yang di-generate oleh Yii. Bukalah dan isikan kode untuk membuat tabel items, seperti kode sumber di bawah ini.
public function up() { $this->createTable('items', [ 'id' => Schema::TYPE_PK, 'code' => Schema::TYPE_STRING . ' NOT NULL', 'name' => Schema::TYPE_STRING . ' NOT NULL', 'quantity' => Schema::TYPE_INTEGER . ' DEFAULT 0', 'remarks' => Schema::TYPE_STRING, ]); } public function down() { $this->dropTable('items'); }
Berikutnya kita buatkan migrasi untuk tabel transaction_types dengan menjalankan perintah ini
yii migrate/create create_table_transaction_types
Kemudian tambahkan kode berikut ini untuk membuat tabel transaction_types. Karena kita menggunakan tabel transaction_types ini untuk membedakan transaksi barang masuk dan transaksi barang keluar, maka kita juga harus menambahkan beberapa record ke tabel ini.
public function up() { $this->createTable('transaction_types', [ 'id' => Schema::TYPE_PK, 'code' => Schema::TYPE_STRING . ' NOT NULL', 'name' => Schema::TYPE_STRING . ' NOT NULL', ]); // default data $this->insert('transaction_types', [ 'id' => 1, 'code' => 'IN', 'name' => 'Barang Masuk', ]); $this->insert('transaction_types', [ 'id' => 2, 'code' => 'OUT', 'name' => 'Barang Keluar', ]); } public function down() { $this->dropTable('transaction_types'); }
Berikutnya kita buatkan migrasi untuk tabel transactions dengan menjalankan perintah ini
yii migrate/create create_table_transactions
Kemudian tambahkan kode berikut ini. Karena tabel transactions ini memiliki relasi dengan tabel transaction_types, maka kita juga perlu menambahkan kode untuk men-generate relasi foreign key seperti tampak pada kode di bawah ini.
public function up() { $this->createTable('transactions', [ 'id' => Schema::TYPE_PK, 'trans_code' => Schema::TYPE_STRING . ' NOT NULL', 'trans_date' => Schema::TYPE_DATE . ' NOT NULL DEFAULT 0', 'type_id' => Schema::TYPE_INTEGER . ' NOT NULL', 'remarks' => Schema::TYPE_STRING, ]); // foreign keys $this->addForeignKey( 'fk_transactions_types', 'transactions', 'type_id', 'transaction_types', 'id', 'restrict', 'cascade'); } public function down() { $this->dropTable('transactions'); }
Berikutnya kita buatkan migrasi untuk tabel transaction_details dengan menjalankan perintah ini
yii migrate/create create_table_transaction_details
Kemudian tambahkan kode berikut ini. Karena kita transaction_details ini memiliki relasi dengan tabel transactions dan tabel items maka kita juga perlu menambahkan kode untuk men-generate relasi foreign key seperti tampak pada kode di bawah ini.
public function up() { $this->createTable('transaction_details', [ 'id' => Schema::TYPE_PK, 'trans_id' => Schema::TYPE_INTEGER . ' NOT NULL', 'item_id' => Schema::TYPE_INTEGER, 'quantity' => Schema::TYPE_DECIMAL . '(15,2) NOT NULL DEFAULT 0', 'remarks' => Schema::TYPE_STRING, ]); // foreign keys $this->addForeignKey( 'fk_transaction_details_transactions', 'transaction_details', 'trans_id', 'transactions', 'id', 'restrict', 'cascade'); $this->addForeignKey( 'fk_transaction_details_items', 'transaction_details', 'item_id', 'items', 'id', 'restrict', 'cascade'); } public function down() { $this->dropTable('transaction_details'); }
Jangan lupa ditambahkan baris berikut ini di setaip file migration, karena kita menggunakan class Schema untuk mendefinisikan tipe data field.
use yii\db\Schema;
Setelah semua migrasi kita siapkan, maka yang perlu kita lakukan adalah mengeksekusi migrasi tersebut. Caranya sangat mudah cukup dengan menjalankan perintah
yii migrate
Contoh hasil eksekusinya tampak pada screenshot di bawah ini.
Kode sumber (source code) bisa dilihat di laman ini.
Generate Models Menggunakan Gii
Yii menyediakan extension Gii untuk memudahkan kita men-generate code untuk models, forms, CRUD, modules dan sebagainya. Gii bisa diakses melalui URL
http://localhost/path/to/index.php?r=gii
Atau jika kamu sudah menggunakan fitur pretty URL, maka Gii dapat diakses di
http://localhost/path/to/index.php/gii
Berikutnya silakan buka Model Generator agar kita bisa men-generate models untuk database kita. Seperti tampak pada screenshot di bawah ini.
[collapsed title=Generate Models][/collapsed]
Isikan Table Name dengan nama table yang ingin kita generate code models-nya dan biarkan Model Class di-generate secara otomatis oleh Gii. Biarkan semua opsi lainnya sesuai default-nya saja. Perhatikan field namespace terisi dengan app\models maka nanti Fully Qualified Class Name dari models yang kita buat menjadi app\models\Items. Fully Qualified Class Name ini perlu kita ingat karena akan berguna pada saat kita men-generate form CRUD.
Selanjutnya tekan tombol [Preview] agar Gii membuat preview hasil code generation-nya, seperti tampak pada screenshot di bawah ini.
[collapsed title=Generate Models][/collapsed]
Karena ini sifatnya hanya preview, tujuannya adalah agar Gii tidak sampai menimpa file yang mungkin sudah kita ubah sebelumnya. Jika action yang tampil adalah create maka langsung saja tekan tombol [Generate] agar Gii benar-benar men-generate file yang kita inginkan.
[collapsed title=Generate Models][/collapsed]
Lakukanlah hal yang sama untuk semua table di aplikasi ini, sehingga semua table yang ada di database tersedia file model-nya
Selamat mencoba…..!