[Yii Framework] Mudah Memainkan Database Anda dengan Active Record
August 29, 2011 17 Comments
Pada Yii Framework dikenal Active Record yang digunakan untuk mempermudah aplikasi berinteraksi dengan database. Yii sendiri sudah cukup jelas memaparkan penggunaan active record pada Yii Framework disini. Tapi saya akan ulas kembali lebih detail beberapa hal terkait cara penggunaan Yii Framework sendiri pada sebuah aplikasi. Saya sendiri akan membahas beberapa active record yang sangat sering saya gunakan dalam pembuatan aplikasi, diantaranya sebagai berikut:
Misal saya memiliki sebuah database dengan tabel “biodata”. Tabel “biodata” sendiri memiliki attribute sebagai berikut:
- id : Primary Key, Integer, Auto Increment
- nama : varchar(100)
- alamat : text il
- FindByPk() : Digunakan untuk menemukan data yang memiliki Primary Key tertentu.
$itu=Biodata::model()->findByPk(2);
Code di atas akan mengembalikan sebuah nilai dari tabel biodata yang memiliki “id” 2. Untuk menampilkan hasil nya, anda dapat gunakan code seperti berikut:
echo $itu->id; (untuk menampilkan id nya) echo $itu->nama; (untuk menampilkan nama nya) echo $itu->alamat; (untuk menampilkan alamatnya)
- FindByAttributes(): Digunakan untuk menemukan data yang memiliki attribute tertentu.
$itu=Biodata::model()->findByAttributes(array('nama'=>'Ali')); atau bisa juga $itu=Biodata::model()->findByAttributes(array('nama'=>'Joko','alamat'=>'Palembang'));
Sedangkan tata cara untuk menampilkannya sama saja dengan yang digunakan pada ‘findByPk()’
- FindAllByAttributes() : Digunakan untuk menemukan data yang memiliki attribute tertentu, tapi data yang di hasilkan lebih dari 1 row data.
$itu=Biodata::model()->findAllByAttributes(array('nama'=>'Joko'));
Dari code di atas, akan dihasilkan 2 buah row data. Yaitu data dengan ‘id’ 1 dan 3, itu karena kedua nya memiliki ‘nama’ Joko. Karena data yang dihasilkan lebih dari 1, maka cara menampilkannya pun harus 1 per 1. Berikut tata cara untuk menampilkan data nya:
foreach($itu as $i=>$ii) { echo $ii->id; echo $ii->nama; echo $ii->alamat; }
- Menggunakan ‘scopes’
public function scopes() { return array( 'panggilJoko'=>array( 'condition'=>'nama=Joko', 'limit'=>5, ), ); }
$itu=Biodata::model()->panggilJoko()->findAll(); //berikut untuk menampilkan nya foreach($itu as $i=>$ii) { echo $ii->id; echo $ii->nama; echo $ii->alamat; }
- Menggunakan ‘scopes’ dengan parameter
public function panggilSiapa($nama=Joko) { $this->getDbCriteria()->mergeWith(array( 'condition'=>'nama='.$nama, 'limit'=>4, )); return $this; }
$itu=Biodata::model()->panggilSiapa()->findAll(); //mengembalikan semua data dengan nama Joko $itu=Biodata::model()->panggilSiapa('Ali')->findAll(); //mengembalikan semua data dengan nama Ali
Sedangkan cara menampilkan data nya adalah sebagai berikut:
foreach($itu as $i=>$ii) { echo $ii->id; echo $ii->nama; echo $ii->alamat; }
Penggunaan Active Record lebih lambat dari menggunakan SQL query secara langsung ke database. Hal ini sudah dijelaskan langsung dari Yii Framework disini.
gan . cara nampilin data berdasarkan level yang sudah di tentukan di database gimana gan . permisalan ane punyak tabel dengan nama USER kemudian ade kolom level dengan isi kolom operator,admin ama userbiasa. cara nampilin data berdasarkan level = operator ama admin mengunakan zii.widgets.grid.CGridView gi mana gan maklum masih new nih gan.
mksd ny gmana gan? bisa di jelasin lebih detail lagi?
halo gan,.. mau request dong, tutorial about pembuatan module di yii… hehe maklum masih nubie..
thx.before.
iya, gan kalo sempet saya coba nanti..
halo sabit, sebelumnya thq buat info2 sama tutor yii-nya yang sedikit banyak udah bantu TA gw kmrn hahaha.
well, berhubung masih belajar juga ni soal yii, merhatiin TA gw kmrn dalam pembuatan modules buat beck-end, kalo gw perhatiin apakah bukannya ada duplikasi file disitu about file controller dan model?
mungkin itu aja sih yang pengen di omongin sama ditanyain, sebelumnya thq buat tutor2nya.
mksd nya duplikasi yang mana gan?
Reblogged this on tjhia Blog's.
mau tanya nih.findbyattributes kalo tampilannya untuk tabel, syntaxnya gimana ya gan?
findbyattributes cuma akan mengembalikan 1 nilai aja gan, jadi percuma di tampilin di tabel..
oh gitu ya..oke gan.kalo mau nampilin data dari tabel di CGridView tapi berdasarkan salah satu atribut tabelnya gimana?jadi misal ane punya tabel
naskah –> user –> jabatan
id_naskah (PK) id_user (PK) id_jabatan(PK)
id_ pengirim (FK) id_jabatan (FK) nama jabatan
perihal
content
id_pengirim itu FK dari id_user (namanya nggak sama)..nah yang ane mau tanyain :
1. gimana nampilin data di CGridView naskah yang id_pengirimnya user yang sedang manggunakan aplikasi?
2. gimana nampilin nama jabatan di CGridView naskah?
maap gan kalo nanya banyak.maklum ane newbie pake banget.thx before
di blog ini ada tutor untuk menampilkan data yang berelasi, ada juga untuk memfilter dari relasi tabel nya.. coba dicari aja mas..
klo pke for phpbiasa bisa gk?
bisa gan. Yii itu dari php, pasti dia bisa ngerjain yang pake php biasa.
halo mas,
mau tanya
pas, saya mau hapus kategori (posisi sebagai admin)
muncul pesan kayak gini :
CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`forum`.`thread`, CONSTRAINT `thread_ibfk_4` FOREIGN KEY (`kategori_id`) REFERENCES `kategori` (`id`) ON UPDATE CASCADE). The SQL statement executed was: DELETE FROM `kategori` WHERE `kategori`.`id`=1
C:\xampp\htdocs\yii\framework\db\CDbCommand.php(358)
346 {
347 if($this->_connection->enableProfiling)
348 Yii::endProfile(‘system.db.CDbCommand.execute(‘.$this->getText().$par.’)’,’system.db.CDbCommand.execute’);
349
350 $errorInfo=$e instanceof PDOException ? $e->errorInfo : null;
351 $message=$e->getMessage();
352 Yii::log(Yii::t(‘yii’,’CDbCommand::execute() failed: {error}. The SQL statement executed was: {sql}.’,
353 array(‘{error}’=>$message, ‘{sql}’=>$this->getText().$par)),CLogger::LEVEL_ERROR,’system.db.CDbCommand’);
354
355 if(YII_DEBUG)
356 $message.=’. The SQL statement executed was: ‘.$this->getText().$par;
357
358 throw new CDbException(Yii::t(‘yii’,’CDbCommand failed to execute the SQL statement: {error}’,
359 array(‘{error}’=>$message)),(int)$e->getCode(),$errorInfo);
360 }
361 }
362
363 /**
364 * Executes the SQL statement and returns query result.
365 * This method is for executing an SQL query that returns result set.
366 * @param array $params input parameters (name=>value) for the SQL execution. This is an alternative
367 * to {@link bindParam} and {@link bindValue}. If you have multiple input parameters, passing
368 * them in this way can improve the performance. Note that if you pass parameters in this way,
369 * you cannot bind parameters or values using {@link bindParam} or {@link bindValue}, and vice versa.
370 * Please also note that all values are treated as strings in this case, if you need them to be handled as
# itu kenapa yaa ?
terima kasih
berrti field itu ada di pakai di tabel lain sebagai relasi gan.. kalo kekeuh mau ngapus, yang pake data tersebut di tabel lain, harus dihapus dulu data nya..
Gan, saya baru belajar yii.
Cara menampilkan record dari table berbeda dengan controller yang tidak ber-relasi bagaimana?
Saya lihat disitu bisa menggunakan findAll(), tapi saya tidak paham findAll-nya diletakkan dimana dan cara menampilkannya.
Terima kasih.
sori baru bales. Pake query sql biasa aja dengan Csqldataprovider