Data Access Objects (DAO) atau Objek Akses Data menyediakan API generik untuk mengakses data yang disimpan dalam sistem manajemen database (DBMS) yang berbeda. Hasilnya, Lapisan DBMS dapat diubah ke yang lain yang berbeda tanpa memerlukan perubahan kode yang menggunakan DAO untuk mengakses data.
Yii DAO dibangun di atas PHP Data Objects
(PDO) yang merupakan extension
yang menyediakan akses data gabungan untuk beberapa DBMS populer, seperti MySQL,
PostgreSQL. Oleh karena itu, untuk menggunakan Yii DAO, extension PDO dan driver database
PDO tertentu (misalnya PDO_MYSQL
) harus sudah terinstal.
Yii DAO terdiri dari empat kelas utama sebagai berikut:
Berikutnya, kami memperkenalkan pemakaian Yii DAO dalam skenario berbeda.
Untuk membuat koneksi database, buat instance CDbConnection dan mengaktifkannya. Nama sumber data (DSN) diperlukan untuk menetapkan informasi yang diperlukan untuk menyambung ke database. Nama pengguna dan kata sandi juga diperlukan guna melakukan koneksi. Exception akan dimunculkan seandainya kesalahan terjadi selama pelaksanaan koneksi (misalnya DSN tidak benar atau username/password tidak benar).
$connection=new CDbConnection($dsn,$username,$password);
// melakukan koneksi. Anda dapat mencoba try...catch exception yang mungkin
$connection->active=true;
......
$connection->active=false; // tutup koneksi
Format DSN tergantung pada driver PDO database yang digunakan. Secara umum, DSN terdiri dari nama driver PDO, diikuti oleh titik dua, diikuti oleh sintaks koneksi spesifik-driver. Lihat Dokumentasi PDO untuk informasi lebih lengkap. Di bawah ini adalah daftar format DSN yang umum dipakai:
sqlite:/path/to/dbfile
mysql:host=localhost;dbname=testdb
pgsql:host=localhost;port=5432;dbname=testdb
mssql:host=localhost;dbname=testdb
oci:dbname=//localhost:1521/testdb
Karena CDbConnection diturunkan dari CApplicationComponent, kita juga dapat
menggunakannya sebagai komponen
aplikasi. Untuk melakukannya, konfigurasi
dalam komponen aplikasi db
(atau nama lain) pada konfigurasi
aplikasi sebagai berikut,
array(
......
'components'=>array(
......
'db'=>array(
'class'=>'CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=testdb',
'username'=>'root',
'password'=>'password',
'emulatePrepare'=>true, // pada beberapa instalasi MySQL, diperlukan
),
),
)
Selanjutnya kita dapat mengakses koneksi DB via Yii::app()->db
yang sudah
diaktifkan secara otomatis, kecuali dikonfigurasi secara eksplisit
CDbConnection::autoConnect menjadi false. Menggunakan pendekatan ini, koneksi DB
tunggal dapat dibagi dalam tempat multipel pada kode kita.
Setelah koneksi database terlaksana, pernyataan SQL dapat dijalankan menggunakan CDbCommand. Membuat instance CDbCommand dengan memanggil CDbConnection::createCommand() dengan pernyataan SQL yang ditetapkan:
$connection=Yii::app()->db; // asumsi bahwa Anda memiliki koneksi "db" yang terkonfigurasi
// Jika tidak, Anda bisa membuat sebuah koneksi secara eksplisit
// $connection=new CDbConnection($dsn,$username,$password);
$command=$connection->createCommand($sql);
// jika diperlukan, statement SQL dapat diupdate sebagai berikut
// $command->text=$newSQL;
Pernyataan SQL dijalankan via CDbCommand dalam dua cara berikut:
execute(): melakukan pernyataan SQL non-query,
seperti INSERT
, UPDATE
and DELETE
. Jika berhasil, mengembalikan
sejumlah baris yang dipengaruhi oleh eksekusi
query(): melakukan pernyataan SQL yang mengembalikan
baris data, seperti SELECT
. Jika berhasil,mengembalikan instance CDbDataReader
yang dapat ditelusuri baris data yang dihasilkan. Untuk
kenyamanan, satu set metode queryXXX()
juga diimplementasikan yang secara
langsung mengembalikan hasil query.
Exception akan dimunculkan jika kesalahan terjadi selama eksekusi pernyataan SQL.
$rowCount=$command->execute(); // jalankan SQL non-query
$dataReader=$command->query(); // jalankan query SQL
$rows=$command->queryAll(); // query dan kembalikan seluruh baris hasil
$row=$command->queryRow(); // query dan kembalikan baris pertama hasil
$column=$command->queryColumn(); // query dan kembalikan kolom pertama hasil
$value=$command->queryScalar(); // query dan kembalikan field pertama dalam baris pertama
Setelah CDbCommand::query() membuat instance CDbDataReader, Anda
bisa mengambil baris data yang dihasilkan oleh pemanggilan CDbDataReader::read()
secara berulang. Ia juga dapat menggunakan CDbDataReader dalam konsrruksi bahasa PHP
foreach
untuk mengambil baris demi baris.
$dataReader=$command->query();
// memanggil read() secara terus menerus sampai ia mengembalikan false
while(($row=$dataReader->read())!==false) { ... }
// menggunakan foreach untuk menelusuri setiap baris data
foreach($dataReader as $row) { ... }
// mengambil seluruh baris sekaligus dalam satu array tunggal
$rows=$dataReader->readAll();
Catatan: Tidak seperti query(), semua metode
queryXXX()
mengembalikan data secara langsung. Sebagai contoh, queryRow() mengembalikan array yang mewakili baris pertama pada hasil query.
Ketika aplikasi menjalankan beberapa query, setiap pembacaan dan/atau penulisan informasi dalam database, penting untuk memastikan bahwa database tidak tertinggal dengan hanya beberapa query yang dihasilkan. Transaksi diwakili oleh instance CDbTransaction dalam Yii, dapat diinisiasi dalam hal:
Alur kerja di atas dapat diimplementasikan menggunakan kode berikut:
$transaction=$connection->beginTransaction();
try
{
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
//.... eksekusi SQL lainnya
$transaction->commit();
}
catch(Exception $e) // exception dimunculkan jika query gagal
{
$transaction->rollBack();
}
Untuk menghindari serangan injeksi SQL dan meningkatkan kinerja pelaksanaan pernyataan SQL secara terus menerus, Anda dapat "menyiapkan" sebuah pernyataan SQL dengan opsional penampung parameter yang akan diganti dengan parameter sebenarnya selama proses pengikatan parameter.
Penampung parameter dapat bernama (disajikan sebagai token unik) ataupun tidak bernama (disajikan sebagai tanda tanya). Panggil CDbCommand::bindParam() atau CDbCommand::bindValue() untuk mengganti penampung ini dengan parameter sebenarnya. Parameter tidak harus bertanda kutip: lapisan driver database melakukan ini bagi Anda. Pengikatan parameter harus dikerjakan sebelum pernyataan SQL dijalankan.
// SQL dengan dua penampung ":username" and ":email"
$sql="INSERT INTO tbl_user (username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// ganti penampung ":username" dengan nilai username sebenarnya
$command->bindParam(":username",$username,PDO::PARAM_STR);
// ganti penampung ":email" dengan nilai email sebenarnya
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// sisipkan baris lain dengan set baru parameter
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();
Metode bindParam() dan bindValue() sangat mirip. Perbedaannya hanyalah bahwa bidParam mengikat parameter dengan referensi variabel PHP sedangkan bindValue dengan nilai. Untuk parameter yang mewakili memori blok besar data, bindParam dipilih dengan pertimbangan kinerja.
Untuk lebih jelasnya mengenai pengikatan parameter, lihat dokumentasi PHP relevan.
Ketika mengambil hasil query, Anda dapat mengikat kolom ke variabel PHP dengan demikian hasil akan dipopulasi secara otomatis dengan data terbaru setiap kali baris diambil.
$sql="SELECT username, email FROM tbl_user";
$dataReader=$connection->createCommand($sql)->query();
// ikat kolom ke-1 (username) ke variabel $username
$dataReader->bindColumn(1,$username);
// ikat kolom ke-2 (email) ke variabel $email
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
// $username dan $email berisi username dan email pada baris saat ini
}
Yii menyediakan dukungan terintegrasi untuk menggunakan
prefiks tabel. Prefiks tabel merupakan sebuah string yang dipasang di depan nama
tabel yang sedang terkoneksi ke database. Kebanyakan digunakan pada lingkungan
shared-hosting yang mana berbagai aplikasi saling pakai sebuah database dan menggunakan
prefiks tabel yang berbeda untuk saling membedakan. Misalnya, satu aplikasi bisa
menggunakan tbl_
sebagai prefiks sedangkan aplikasi yang lain bisa saja menggunakan yii_
Untuk menggunakan prefiks tabel, mengkonfigurasi properti CdbConnection::tablePrefix menjadi
sesuai dengan prefiks tabel yang diinginkan. Kemudia, dalam statement SQL gunakan {{NamaTabel}}
untuk merujuk nama tabel, di mana NamaTabel
adalah nama table tanpa prefik.
Misalnya, jika database terdapat sebuah tabel bernama tbl_user
di mana tbl_
dikonfigurasi sebagai prefiks tabel, maka kita dapat menggunakan kode berikut untuk query user.
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.