Membangun Aplikasi Seminar Berbasis Web Denggan Codeigniter 4 Basis Data Dan Migration
By Harjito
Menyiapkan Basis Data
Langkah pertama dalam menyiapkan sistem adalah menyusun rancangan basis data. Dalam sistem yang akan kita kembangkan, basis data yang kita gunakan adalah mysql. Oleh sebab itu, diharapkan pembaca sudah cukup familier dengan penggunaan basis data ini.
Langkah pertama tentunya kita membuat basis data. Basis data yang akan kita gunakan kita beri nama seminar. User database adalah seminar dengan password seminar123.
Langkah pertama kita masuk terminal dengan perintah kombinasi tombol Ctrl + alt + t. Lalu kita masuk ke mysql dengan serangkaian perintah sebagai berikut.
sudo mysql -uroot -p
/*
ketikkan password root lalu tekan enter
Jika password yang kita masukkan benar
maka akan muncul prompt mysql
*/
mysql >
Dalam prompt mysql kita ketikkan serangkaian perintah
CREATE DATABASE seminar;
/*
Membuat database dengan nama 'seminar'
*/
CREATE USER 'seminar'@'localhost' IDENTIFIED BY 'seminar123';
GRANT ALL PRIVILEGES ON seminar.* TO 'seminar'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Membuat user spesifik untuk satu aplikasi berguna untuk mengisolasi permasalahan akibat sql injection sehingga tidak mempengaruhi database lain. Untuk memastikan bahwa user yang kita buat sudah benar ketikkan perintah berikut.
mysql -useminar -e "show databases;" -pseminar123
Kita lihat user seminar hanya bisa mengakses satu database yaitu seminar seperti terlihat pada tampilan berikut.
+--------------------+
| Database |
+--------------------+
| information_schema |
| seminar |
+--------------------+
Konfigurasi Aplikasi
Selanjutnya kita akan melakukan konfigurasi pada apliaksi. Ikuti langkah berikut.
- Buka fila env dalam folder Seminar (selanjutnya kita sebut sebagai direktori root).
- Aktifkan CI_ENVIRONTMENT dengan cara menghapus tanda pagar (#) pada baris 17 yang semula berbunyi # CI_ENVIRONMENT = production menjadi CI_ENVIRONMENT = production
- Masih di baris yang sama ubah kata production menjadi development
- aktifkan baris 42 sampai 47
- pada baris 43, ubah ci4 menjadi seminar
- pada baris 44, ubah root menjadi seminar
- pada baris 45, ubah root menjadi seminar123
- Terakhir, kita ganti file env menjadi .env
*Jika menggunakan VsCode, untuk mengaktifkan atau mndeaktifkan script kita bisa menggunaka kombinasi tombol ctrl+/
Mengelola Tabel melalui Migration
Sistem yang kita kembangkan akan memiliki beberapa tabel. Tabel tersebut adalah sebagai berikut.
- users (Menampung data user)
- roles (menampung data role)
- users_roles (tabel penghubung antara users dan roles)
- participants (sebagai keranjang pendaftaran)
- submission (sebagai penampung dokumen abstrak)
Jika sudah siap, ikuti instruksi berikut.
- Buka Vs. Code
- Buka folder ~/Seminar yang sudah kita siapkan app-starter CI4 (lihat kembali \chaptertitlename~\ref{persiapan_system})
- Buka terminal di Vs. Code
Menyiapkan tabel pengguna
Untuk menyiapkan migration untuk user ikuti instruksi berikut. Di terminal buat file migration dengan perintah:
php spark make:migration User;
/*
Membuat migrasi untuk tabel users. Tunggu sampai
file migrasi untuk users terbentuk.
*/
Buka File yyyy-mm-dd-xxxxx_User.php dalam folder app/Database/Migrations/.
Tambahkan script berikut dalam method up.
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
'auto_increment' => TRUE,
],
'google_id' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'email' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'picture' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'formal_name' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
'deleted_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addPrimaryKey('id',TRUE);
$this->forge->addUniqueKey('google_id',TRUE);
$this->forge->addUniqueKey('email',TRUE);
$this->forge->createTable('users', false, ['ENGINE' => 'InnoDB']);
Tambahkan script berikut dalam method down.
$this->forge->dropTable('users', false);
Selanjutkan kita jalankan migration dengan perintah berikut.
php spark migrate
Kita dapat cek hasilnya dengan perintah berikut.
mysql -e "use seminar; describe users;" -useminar -pseminar123
Hasilnya akan terlihat seperti pada tampilan berikut.
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| google_id | varchar(50) | NO | UNI | NULL | |
| email | varchar(50) | NO | UNI | NULL | |
| picture | varchar(100) | NO | | NULL | |
| formal_name | varchar(50) | NO | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
Menyiapkan tabel untuk peran
Untuk menyiapkan migration untuk roles ikuti instruksi berikut. Di terminal buat file migration dengan perintah:
php spark make:migration Role;
Buka File yyyy-mm-dd-xxxxx_Role.php dalam folder app/Database/Migrations/.
Tambahkan script berikut dalam method up.
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
'auto_increment' => TRUE,
],
'code' => [
'type' => 'VARCHAR',
'constraint' => 20,
],
'name' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
'deleted_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addPrimaryKey('id',TRUE);
$this->forge->addUniqueKey('code',TRUE);
$this->forge->createTable('roles', false, ['ENGINE' => 'InnoDB']);
Tambahkan script berikut dalam method down.
$this->forge->dropTable('roles', false);
Selanjutkan kita jalankan migration dengan perintah berikut.
php spark migrate
Kita dapat cek hasilnya dengan perintah berikut.
mysql -e "use seminar; describe roles;" -useminar -pseminar123
Hasilnya akan terlihat seperti pada tampilan berikut.
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| code | varchar(20) | NO | UNI | NULL | |
| name | varchar(50) | NO | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
+------------+------------------+------+-----+---------+----------------+
Sedangkan untuk memeriksa migration yang telah kita lakukan dapat kita lakukan dengan perintah sebagai berikut.
mysql -e "use seminar; select * from migrations;" -useminar -pseminar123
Hasilnya akan terlihat seperti pada tampilan berikut.
+----+-------------------+------------------------------+---------
+-----------+------------+-------+
| id | version | class | group
| namespace | time | batch |
+----+-------------------+------------------------------+---------
+-----------+------------+-------+
| 1 | 2022-08-07-113134 | App\Database\Migrations\User | default
| App | 1659872657 | 1 |
| 2 | 2022-08-07-120859 | App\Database\Migrations\Role | default
| App | 1659874175 | 2 |
+----+-------------------+------------------------------+---------
+-----------+------------+-------+
Menyiapkan tabel penghubung antara pengguna dan peran
Dalam kasus ini hubungan antara pengguna dan peran adalah many to many. Hubungan ini berarti seorang pengguna dapat memiliki beberapa peran sekaligus dan setiap peran dapat dimiliki oleh beberapa orang sekaligus. Hubungan many to many memerlukan sebuah tabel penghubung. Untuk memudahkan mengingat, tabel penghubung itu kita beri nama users_roles.
Untuk membuat tabel penghubung, kita siapkan migration dengan perintah berikut.
php spark make:migration user_role
Buka File yyyy-mm-dd-xxxxx_UserRole.php dalam folder app/Database/Migrations/.
Tambahkan script berikut dalam method up.
$this->forge->addField([
'user_id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
],
'role_id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
'deleted_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addKey(['user_id', 'role_id'], TRUE);
$this->forge->addForeignKey('user_id', 'users', 'id', '', 'CASCADE');
$this->forge->addForeignKey('role_id', 'roles', 'id', '', 'CASCADE');
$this->forge->createTable('users_roles', false, ['ENGINE' => 'InnoDB']);
Tambahkan script berikut dalam method down.
$this->forge->dropTable('users_roles', false);
Perhatikan pada tabel penghubung, terdapat dua foreign key yaitu user_id dan role_id. Foreign key kita set CASCADE, tujuannya agar ketika ada data user atau role yang dihapus, data penghubung terkait data yang sudah dihapus otomatis ikut terhapus. Dengan demikian, integritas data dapat dijaga dan tidak ada fragmen data yang tidak jelas relasinya. Selanjutnya kita lakukan migration dengan perintah berikut.
php spark migrate
Kita dapat cek hasilnya dengan perintah berikut.
mysql -e "use seminar; describe users_roles;" -useminar -pseminar123
Hasilnya akan terlihat seperti pada tampilan berikut.
+------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| user_id | int(11) unsigned | NO | PRI | NULL | |
| role_id | int(11) unsigned | NO | PRI | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
+------------+------------------+------+-----+---------+-------+
Menyiapkan tabel peserta
Selanjtnya kita akan buat data peserta. Peserta yang kita buat nantinya akan ada flag untuk membedakan apakah peserta penulis atau peserta non penulis. Struktur table bisa kita lihat pada penjelasan berikut. Tentunya pertama kita buat dulu migration dengan perintah berikut.
php spark make:migration participant
Langkah berikutnya kita isikan method up dengan script berikut.
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
'auto_increment' => TRUE,
],
'user_id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
],
'name' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'affiliation' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'name_in_cert' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'interest' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'whatsapp' => [
'type' => 'VARCHAR',
'constraint' => 20,
],
'member_as' => [
'type' => 'VARCHAR',
'constraint' => 10,
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
'deleted_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addPrimaryKey('id',TRUE);
$this->forge->addKey(['user_id','deleted_at'],TRUE);
$this->forge->addForeignKey('user_id', 'users', 'id', '', 'CASCADE');
$this->forge->createTable('participants', false, ['ENGINE' => 'InnoDB']);
Jika kita lihat, tabel participants terhubung dengan tabel user. Artinya ketika user tersebut dihapus, maka data participant terkait data user yang dihapus akan otomatis juga terhapus.Untuk method down dengan script berikut.
$this->forge->dropTable('participants', false);
Setelah migration dijalankan, maka tabel pun dibuat di database. Anda bisa melakukan pengecekan mengikuti contoh sebelumnya.
Terakhir adalah tabel submisi. Tabel submisi digunakan untuk mencatat data pengiriman abstrak. Kita buat dulu migration dengan perintah berikut.
php spark make:submission
Data submisions terhubung dengan data participant. Script pada method up dengan script berikut.
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
'auto_increment' => TRUE,
],
'participant_id' => [
'type' => 'INT',
'constraint' => 11,
'unsigned' => TRUE,
],
'title' => [
'type' => 'VARCHAR',
'constraint' => 250,
],
'abstract' => [
'type' => 'VARCHAR',
'constraint' => 250,
],
'status' => [
'type' => 'VARCHAR',
'constraint' => 20,
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
'deleted_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addPrimaryKey('id',TRUE);
$this->forge->addForeignKey('participant_id', 'participants', 'id', '', 'CASCADE');
$this->forge->createTable('submissions', false, ['ENGINE' => 'InnoDB']);
Untuk method down kita tuliskan script berikut.
$this->forge->dropTable('participants', false);
Pengembangan Lebih Lanjut
Penambahan Tabel Baru
Jika kita ingin menambahkan tabel baru kita tinggal siapkan migration untuk tabel tersebut. Urutan langkahnya sesuai dengan contoh adalah
- Membuat file migration
- Menulis script untuk method up
- Menulis script untuk method down
- Menjalankan migration
Memodifikasi struktur tabel
Ada dua cara memodifikasi struktur tabel. Cara pertama, jika tabel belum terisi data. Dalam hal ini misalkan kita ingin mengubah struktur participant. Sangat penting memahami urutan migration. Tabel participant dibuat sebelum data submission, oleh sebab itu kita perlu rollback dua kali. Berikut urutan langkahnya.
- Jalankan perintah: php spark migrate:rollback (menghapus tabel submisiion)
- Jalankan kembali perintah: php spark migrate:rollback (menghapus tabel participants)
- Ubah struktur tabel participant di file migration
- Jalankan perintah php spark migrate
Jika tabel sudah terisi data, kita tidak bisa melakukan cara pertama karena data yang sudah masuk akan terhapus dan tidak bisa dikembalikan. Misalkan kita akan menambahkan kolom baru pada tabel participant yaitu telegram_id varchar(20) dan mengubah kolom interes dari varchar(50) menjadi varchar(100). Langkah yang perlu kita lakukan adalah membuat migration baru, sebut saja namanya participant_add_telegram. Maka kita buat duli file migration dengan perintah berikut.
php spark make:migration participant_add_telegram;
Tambahkan script berikut untuk method up.
$this->forge->addColumn('participants',[
'telegram_id' => [
'type' => 'VARCHAR',
'constraint' => 20,
]
]);
$this->forge->modifyColumn('participants',[
'interest' => [
'type' => 'VARCHAR',
'constraint' => 100,
]
]);
Karena asumsi kita, tabel sudah berisi data, maka sebaiknya method down kita kosongkan untuk mempertahankan integritas data. Jika kita ingin menbatalkan perubahan kita buat migration baru lalu pada method up kita isikan script yang berlawanan dengan perubahan sebelumnya seperti script berikut.
$this->forge->dropColumn('participants',[
'telegram_id'
]);
$this->forge->modifyColumn('participants',[
'interest' => [
'type' => 'VARCHAR',
'constraint' => 50,
]
]);
Memanfaatkan Seeder Untuk Data Awal
Data awal dalam aplikasi diperlukan agar aplikasi bisa berjalan dengan normal. Beberapa data awal yang sering dibutuhkan biasanya terkait dengan konfigurasi. Sebagai contoh data roles. Bagaimana cara membuat seeder? Ikuti langkah-langkah berikut.
Buka console dan jalankan perintah berikut.
php spark make:seeder roles
Sebuah file seeder akan dibuat di dengan path /app/Database/Seeds/Roles.php . Buka file tersebut dengan editor. Lalu tambahkan baris berikut
use App\Models\Role;
setelah use CodeIgniter\Database\Seeder; Pada method run, tambahkan baris perintah berikut
echo "Insert data Roles\n";
(new Role())->insertBatch([
[
'code' => 'admin',
'name' => 'Admnistrator',
],
[
'code' => 'secretary',
'name' => 'Sekretariat',
],
[
'code' => 'editor',
'name' => 'Editor',
],
[
'code' => 'reviewer',
'name' => 'Reviewer',
],
[
'code' => 'member',
'name' => 'Peserta',
],
]);
echo "Data Roles berhasil ditambahkan\n";
Untuk menjalankan proses pengisian data jalankan perintah berikut.
php spark db:seed Roles
Jika muncul hasil seperti ini
Insert data Roles
Data Roles berhasil ditambahkan
Artinya proses pengisian data berhasil. Di topik berikutnya kita akan membahas mengenai model dan validasi data.
Tags:
Ikuti terus tutorial saya di e-Project dan channel
saya di