Bekerja dengan Database ====================== Bagian ini akan memaparkan bagaimana membuat halaman yang menampilkan daftar data negara yang diambil dari tabel `country` pada database. Untuk menyelesaikan tugas ini, anda akan melakukan konfigurasi koneksi ke database, membuat class [Active Record](db-active-record.md), membuat [action](structure-controllers.md), dan membuat [view](structure-views.md). Sepanjang tutorial ini, anda akan mempelajari bagaimana cara untuk: * konfigurasi koneksi ke database, * membuat class _ActiveRecord_, * mengambil _(query)_ data menggunakan class _ActiveRecord_, * menampilkan data ke view dengan halaman per halaman. Sebagai catatan untuk menyelesaikan bagian ini, anda harus memiliki pengetahuan dan pengalaman dasar dalam menggunakan database. Secara khusus, anda harus mengetahui cara membuat database, dan cara menjalankan perintah SQL menggunakan aplikasi klien database. Menyiapkan Database ---------------------- Untuk memulai, buatlah database dengan nama `yii2basic`, yang akan digunakan untuk mengambil data dalam aplikasi anda. Anda bisa membuat database SQLite, MySQL, PostgreSQL, MSSQL, atau Oracle, dimana Yii mendukung banyak aplikasi database. Untuk memudahkan, database yang digunakan adalah MySQL. Selanjutnya, buat tabel dengan nama `country` pada database, dan _insert_ beberapa data sampel. Anda bisa menjalankan perintah SQL dibawah untuk memudahkan: ```sql CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country` VALUES ('AU','Australia',24016400); INSERT INTO `country` VALUES ('BR','Brazil',205722000); INSERT INTO `country` VALUES ('CA','Canada',35985751); INSERT INTO `country` VALUES ('CN','China',1375210000); INSERT INTO `country` VALUES ('DE','Germany',81459000); INSERT INTO `country` VALUES ('FR','France',64513242); INSERT INTO `country` VALUES ('GB','United Kingdom',65097000); INSERT INTO `country` VALUES ('IN','India',1285400000); INSERT INTO `country` VALUES ('RU','Russia',146519759); INSERT INTO `country` VALUES ('US','United States',322976000); ``` Hingga saat ini, anda memiliki database bernama `yii2basic`, dan didalamnya terdapat tabel `country` dengan tiga kolom, berisi 10 baris data. Konfigurasi Koneksi Database --------------------------- Sebelum melanjutkan, pastikan anda memasang ekstensi PHP [PDO](https://secure.php.net/manual/en/book.pdo.php) dan driver PDO untuk database yang anda gunakan (misal, `pdo_mysql` untuk MySQL). Ini adalah kebutuhan mendasar jika aplikasi anda menggunakan _relational database_. Jika sudah terpasang, buka file `config/db.php` dan sesuaikan parameter yang sesuai untuk database anda. Secara default, isi file konfigurasi tersebut adalah: ```php 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; ``` File `config/db.php` adalah tipikal [konfigurasi](concept-configurations.md) yang menggunakan file. File konfigurasi seperti ini menentukan parameter-parameter yang dibutuhkan untuk membuat dan menginisialisasi objek [[yii\db\Connection]], dimana anda dapat menjalankan perintah SQL dengan database yang dituju. Konfigurasi koneksi database di atas dapat diakses pada kode aplikasi melalui _expression_ `Yii::$app->db`. > Info: File `config/db.php` akan di _include_ oleh konfigurasi aplikasi utama `config/web.php`, yang berfungsi sebagai konfigurasi untuk inisialisasi objek [aplikasi](structure-applications.md). Untuk penjelasan lebih lengkap, silahkan lihat bagian [Konfigurasi](concept-configurations.md). Jika anda membutuhkan dukungan database yang tidak didukung oleh Yii, silahkan cek _extensions_ di bawah ini: - [Informix](https://github.com/edgardmessias/yii2-informix) - [IBM DB2](https://github.com/edgardmessias/yii2-ibm-db2) - [Firebird](https://github.com/edgardmessias/yii2-firebird) Membuat Active Record ------------------------- Untuk mengambil data di tabel `country`, buat class turunan [Active Record](db-active-record.md) dengan nama `Country`, dan simpan pada file `models/Country.php`. ```php Info: Jika nama _class_ tidak sesuai dengan nama tabel, anda dapat meng-_override_ method [[yii\db\ActiveRecord::tableName()]] untuk menentukan nama tabel secara eksplisit. Menggunakan class `Country`, anda bisa memanipulasi data pada tabel `country` dengan mudah, sebagaimana yang ditunjukkan pada kode di bawah ini: ```php use app\models\Country; // mengambil semua negara dari tabel country, dan mengurutkan berdasarkan "name" (nama) $countries = Country::find()->orderBy('name')->all(); // mengambil negara yang memiliki primary key "US" $country = Country::findOne('US'); // menampilkan "United States" echo $country->name; // Mengganti nama negara menjadi "U.S.A." dan menyimpan ke database $country->name = 'U.S.A.'; $country->save(); ``` > Info: _Active Record_ adalah cara yang efektif untuk mengakses dan memanipulasi data dari database secara _object-oriented_. Anda bisa mengetahui lebih banyak lagi pada bagian [Active Record](db-active-record.md). Sebagai alternatif, anda mungkin berinteraksi dengan database menggunakan metode data akses yang lebih mendasar yang disebut [Data Access Objects](db-dao.md). Membuat Action ------------------ Untuk menampilkan data negara ke pengguna, anda harus membuat _action_. Dibanding menempatkan _action_ baru ini pada _controller_ `site` seperti yang sudah anda lakukan pada bagian sebelumnya, sekarang ini ada baiknya membuat spesifik _controller_ untuk semua _action_ yang berhubungan dengan data negara. Namakan _controller_ baru ini dengan `CountryController`, dan buat _action_ `index` pada controller tersebut, seperti yang ditunjukkan di bawah ini. ```php 5, 'totalCount' => $query->count(), ]); $countries = $query->orderBy('name') ->offset($pagination->offset) ->limit($pagination->limit) ->all(); return $this->render('index', [ 'countries' => $countries, 'pagination' => $pagination, ]); } } ``` Simpan kode di atas pada file `controllers/CountryController.php`. _Action_ `index` memanggil `Country::find()`. _Method_ _Active Record_ ini membuat _query_ ke database dan mengambil semua data negara dari tabel `country`. Untuk membatasi jumlah negara yang didapatkan pada setiap pengambilan data, _query_ tersebut dipecah menjadi halaman per halaman dengan bantuan dari objek [[yii\data\Pagination]]. Objek `Pagination` diperuntukkan untuk dua tujuan: * Menentukan klausa `offset` dan `limit` pada perintah SQL yang digunakan untuk _query_ agar mengambil hanya satu halaman data dalam sekali perintah (pada umumnya akan mengambil 5 baris dalam satu halaman). * Digunakan pada _view_ untuk menampilkan tombol halaman yang terdiri dari tombol-tombol nomor halaman, yang selanjutnya akan dijelaskan pada sub bagian berikutnya. Di akhir kode, _action_ `index` me-_render_ _view_ dengan nama `index`, dan mengirimkan data negara beserta dengan informasi halaman dari data tersebut. Membuat View --------------- Di dalam folder `views`, pertama-tama buatlah sub-folder dengan nama `country`. Folder ini akan digunakan untuk menyimpan semua _view_ yang akan di _render_ oleh _controller_ `country`. Di dalam folder `views/country`, buatlah file dengan nama `index.php` berisi kode di bawah ini: ```php