0 follower

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, membuat action, dan membuat view.

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:

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 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

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

File config/db.php adalah tipikal konfigurasi 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. Untuk penjelasan lebih lengkap, silahkan lihat bagian Konfigurasi.

Jika anda membutuhkan dukungan database yang tidak didukung oleh Yii, silahkan cek extensions di bawah ini:

Membuat Active Record

Untuk mengambil data di tabel country, buat class turunan Active Record dengan nama Country, dan simpan pada file models/Country.php.

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Country extends ActiveRecord
{
}

Class Country di extends dari yii\db\ActiveRecord. Anda tidak perlu untuk menulis kode di dalamnya! Hanya dengan kode di atas, Yii akan mengetahui nama tabel yang dimaksud dari nama class tersebut.

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:

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. Sebagai alternatif, anda mungkin berinteraksi dengan database menggunakan metode data akses yang lebih mendasar yang disebut Data Access Objects.

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

namespace app\controllers;

use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 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
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
    <li>
        <?= Html::encode("{$country->name} ({$country->code})") ?>:
        <?= $country->population ?>
    </li>
<?php endforeach; ?>
</ul>

<?= LinkPager::widget(['pagination' => $pagination]) ?>

Terkait dengan tampilan data negara, view ini terdiri dari dua bagian. Bagian pertama, dilakukan perulangan (looping) pada data negara yang tersedia dan di-render sebagai unordered list HTML. Bagian kedua, widget yii\widgets\LinkPager di-render menggunakan informasi halaman (pagination) yang dikirimkan dari action. Widget LinkPager menampilkan tombol-tombol halaman. Mengklik pada salah satu tombol tersebut akan melakukan pengambilan data negara terkait dengan halaman yang diklik.

Mari Kita Coba

Untuk melihat bagaimana kode-kode di atas bekerja, gunakan browser anda untuk mengakses URL ini:

http://hostname/index.php?r=country%2Findex

Daftar Country

Awalnya, anda akan melihat sebuah halaman yang menampilkan 5 negara. Dibawah daftar negara tersebut, anda akan melihat tombol halaman yang berjumlah empat tombol. Jika anda mengklik tombol "2", anda akan melihat halaman tersebut menampilkan 5 negara lain pada database: halaman kedua pada record. Silahkan melakukan observasi secara perlahan-lahan dan anda akan mengetahui bahwa URL pada browser juga akan berganti menjadi

http://hostname/index.php?r=country%2Findex&page=2

Di belakang layar, Pagination menyediakan semua kebutuhkan untuk memecah data menjadi halaman per halaman:

  • Pertama-tama, Pagination menampilkan halaman pertama, dimana menjalankan perintah SELECT pada tabel country dengan klausa LIMIT 5 OFFSET 0. Hasilnya, 5 negara pertama akan diambil dan ditampilkan.
  • Widget LinkPager me-render tombol halaman menggunakan URL yang dibentuk oleh method Pagination. URL tersebut mengandung query string page, yang merupakan representasi dari nomor halaman.
  • Jika anda mengklik tombol halaman "2", sebuah request yang mengarah ke route country/index akan dijalankan hingga selesai. Pagination membaca query string page dari URL dan kemudian menentukan halaman sekarang adalah halaman 2. Query data negara yang baru mengandung klausa LIMIT 5 OFFSET 5 dan mengambil 5 data negara selanjutnya untuk kemudian ditampilkan.

Rangkuman

Pada bagian ini, anda mempelajari bagaimana bekerja dengan database. Anda juga mempelajari bagaimana cara mengambil dan membagi data dengan halaman per halaman dengan bantuan yii\data\Pagination dan yii\widgets\LinkPager.

Di bagian selanjutnya, anda akan mempelajari bagaimana menggunakan generator kode yang disebut Gii, untuk membantu anda mengimplementasikan fitur-fitur umum pada aplikasi secara instan, seperti operasi Create-Read-Update-Delete (CRUD) untuk bekerja dengan data yang terdapat pada tabel di sebuah database. Sebenarnya, kode-kode yang barusan anda tulis, semuanya bisa di generate secara otomatis oleh Yii menggunakan tool Gii.

Found a typo or you think this page needs improvement?
Edit it on github !