Belajar AR (Active Record)

Belajar mengenal AR

AR yang dimaksudkan disini bukanlah AR (Account Receivables) namun (Active Record), jadi menurutku seperti rekaman object gitu kali ya, yang nantinya bisa di pergunakan untuk macam-macam kegunaan. maklum ya kalo salah, karena baru belajar juga neh pren.<!–more–>

untuk menghubungkan antara AR dengan database biasanya menggunakan class [CDbConnection] (Yii DAO)

Contoh :


'class'=>'system.db.CDbConnection', // [CActiveRecord::db]

** catatan : ini berlaku untuk default aplikasi kamu. jadi untuk koneksi beberapa database dalam satu penggunaan, maka harus menggunakan cara lain. Menurut yang saya baca2 bisa menggunakan [CActiveRecord::getDbConnection()].

Btw sebelum jauh saya kasih tau apa itu Yii DAO

Yii DAO adalah Data Access Object, fungsinya untuk mengakses DBMS.

Yii DAO terdiri dari empat kelas utama sebagai berikut:


   - [CDbConnection]: mewakili koneksi ke database.

   - [CDbCommand]: mewakili pernyataan SQL untuk dijalankan pada database.

   - [CDbDataReader]: mewakili forward-only stream terhadap baris dari set hasil queri.

   - [CDbTransaction]: mewakili transaksi DB.

Contoh :


$connection=new CDbConnection($dsn,$username,$password);

$connection->active=true; // buka koneksi

$connection->active=false; // tutup koneksi

$sql = "select blablablabaab"; // contoh query sql

$command=$connection->createCommand($sql);

- [execute()|CDbCommand::execute]: melakukan pernyataan SQL non-queri (Cth: Update, Delete, Insert)

- [query()|CDbCommand::query]: melakukan pernyataan SQL yang mengembalikan (Cth: Select)

  Contoh penggunaan :

  $rowCount=$command->execute();   // jalankan SQL non-queri

  $dataReader=$command->query();   // jalankan queri SQL

  $rows=$command->queryAll();      // queri 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

  // BACA QUERY / MENGAMBIL HASIL QUERY

  $dataReader=$command->query();

  while(($row=$dataReader->read())!==false) { ... } // memanggil read() secara terus menerus sampai ia mengembalikan false

  foreach($dataReader as $row) { ... } // menggunakan foreach untuk menelusuri setiap baris data

  $rows=$dataReader->readAll(); // mengambil seluruh baris sekaligus dalam satu array tunggal

Nah untuk info saja koneksi dari database untuk di rekam dalam AR itu harus dibaca dulu skema data atau metadatanya. ini membutuhkan waktu untuk prosesnya, jika skema data anda cukup besar lebih baik memperbesar caching durationnya. [CDbConnection::schemaCachingDuration].

Contoh :


'schemaCachingDuration'=>3600,  // durasi menjadi 3600 detik

AR katanya hanya mendukung DBMS dibawah ini :

  • [MySQL 4.1 atau lebih tinggi]

  • [PostgreSQL 7.3 atau lebih tinggi]

  • [SQLite 2 dan 3]

  • [Microsoft SQL Server 2000 atau lebih tinggi]

  • [Oracle]

Untuk urusan CRUD (Cread Read Update Delete) Class AR sudah mendukung. Silahkan baca dibawah ini, mudah2an lebih mengerti dari pada baca Tutorial yang bertebaran di inet mengenai yii.

[color="#000080"]Ada permintaan neh dari agan junxiong untuk dijelaskan juga penggunaan fungsi-fungsi crudnya. aku jelasin sedikit yah, tapi kalo salah mohon dikoreksi, karena ini aku baru belajar jg.

Jadi fungsi save(), saveAttributes(), delete() itu berlaku / dipergunakan setelah data telah dibaca / direkam terlebih dahulu kedalam AR.

sekarang kita bicara yang agak mudah dimengerti dulu. yaitu fungsi save(boolean,array); or save($runValidation,$attributes);

  • runValidation itu sendiri jika diberi nilai true maka dia akan secara otomatis akan menjalankan fungsi validate($attributes);

    Jika nilai dari attributes benar maka dia akan melakukan pengecekan data terakhir penyimpanan. jika benar data tersebut adalah data terakhir maka akan dijalankan fungsi update($attributes),

    sebaliknya jika salah maka akan dijalankan fungsi insert($attributes);

Untuk saveAttributes() seharusnya sudah mengerti dunk kalo fungsi save() bisa dimengerti. ^^

saveAttributes(array); or saveAttributes($attributes); // menyimpan daftar attribute yang dipilih

Contoh :


$post=new Post;

$post->title='sample post';

$post->content='content for the sample post';

$dataYgDiSimpan = array('username'=>'YiieRz-sdgBlajar', 'password'=>'belajarYii', 'email'='yiierz-sdgblajar@yiiframework.com', 'createTime'=>time());

$post->saveAttributes($dataYgDisimpan);

attributes diatas dapat diisi dengan array attribute yang kita harapkan[/color]

MEMBACA DATA

MEMBACA DATA KE AR


// merekam baris sesuai dengan kondisi yang ditetapkan

$post=Post::model()->find($condition,$params);

// merekam baris sesuai dengan kunci primer yang ditetapkan

$post=Post::model()->findByPk($postID,$condition,$params);

// merekam baris dengan nilai atribut yang ditetapkan

$post=Post::model()->findByAttributes($attributes,$condition,$params);

// merekam baris pertama menggunakan pernyataan SQL yang ditetapkan

$post=Post::model()->findBySql($sql,$params);

Contoh 1 :


// cari baris dengan postID=10

$post=Post::model()->find('postID=:postID', array(':postID'=>10));</code>

Contoh 2:

<code>$criteria=new CDbCriteria;

$criteria->select='title';  // hanya memilih kolom 'title'

$criteria->condition='postID=:postID';

$criteria->params=array(':postID'=>10);

$post=Post::model()->find($criteria); // $params tidak diperlukan</code>

Contoh 3 :

<code>$post=Post::model()->find(array(

'select'=>'title',

'condition'=>'postID=:postID',

'params'=>array(':postID'=>10),

));

MEMBACA JUMLAH RECORD KE AR


// merekam jumlah baris yang sesuai dengan kondisi yang ditetapkan

$n=Post::model()->count($condition,$params);

// merekam jumlah baris menggunakan pernyataan SQL yang ditetapkan

$n=Post::model()->countBySql($sql,$params);

## MEMBACA PENGECEKAN EXISTS KE AR

// merekam apakah ada satu baris yang sesuai denga kondisi yang ditetapkan

$exists=Post::model()->exists($condition,$params);

SIMPAN DATA

SIMPAN DATA KE AR


// mutakhirkan baris yang sama seperti kondisi yang ditetapkan

Post::model()->updateAll($attributes,$condition,$params);

// mutakhirkan baris yang sama seperti kondisi dan kunci primer yang ditetapkan

Post::model()->updateByPk($pk,$attributes,$condition,$params);

// mutakhirkan kolom counter dalam baris yang sesuai dengan kondisi yang ditetapkan

Post::model()->updateCounters($counters,$condition,$params);

SIMPAN DATA KE DB


[save()|CActiveRecord::save]

Contoh :


$post=new Post;

$post->title='sample post';

$post->content='content for the sample post';

$post->createTime=time();

$post->save();

HAPUS DATA

HAPUS DATA DI AR


// hapus baris yang sesuai dengan kondisi yang ditetapkan

Post::model()->deleteAll($condition,$params);

// hapus baris yang sesuai dengan kondisi dan kunci primer yang ditetapkan

Post::model()->deleteByPk($pk,$condition,$params);

HAPUS DATA DI DB

Contoh :




[delete()|CActiveRecord::delete]

$post=Post::model()->findByPk(10); // menganggap ada tulisan yang memiliki ID = 10

$post->delete(); // hapus baris dari tabel database

VALIDASI DATA

VALIDASI DATA DI AR

– MEMBANDINGKAN REKAMAN AR


[CActiveRecord::equals()]

[primaryKey|CActiveRecord::primaryKey]

– KOSTOMISASI REKAMAN AR


[beforeValidate|CModel::beforeValidate]

[afterValidate|CModel::afterValidate]

[beforeSave|CActiveRecord::beforeSave]

[afterSave|CActiveRecord::afterSave]

?[beforeDelete|CActiveRecord::beforeDelete]

[afterDelete|CActiveRecord::afterDelete]

[afterConstruct|CActiveRecord::afterConstruct]

[afterFind|CActiveRecord::afterFind]

DAH AH SAMPE SINI DULU, NANTI BARU DILANJUTKAN.

Belajar urlManager

Untuk pemula biasanya bingung, kok saya akses website index.php/contact kok bisa ke site/contact. nah ini berarti anda sedang belajar routing web.

untuk route di yii bisa menggunakan urlManager.

urlManager sebetulnya sudah ada tutorialnya, namun kurang pas kalau tidak dibahas secara detail. saya akan coba kupas sedikit mengapa urlManager itu sangat penting diketahui.

saat kita mengakses index.php framework yii akan membaca file config kita contoh config/main.php yang salah satu isinya adalah component urlManager

berikut ini adalah default urlManager dari Yii Framework


'urlManager'=>array(

	'urlFormat'=>'path',

	'rules'=>array(

		'<controller:\w+>/<id:\d+>'=>'<controller>/view',

		'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

		'<controller:\w+>/<action:\w>'=>'<controller>/<action>', 

	),

),

yang harus kita tahu adalah rules / aturan path

\w adalah string

\d adalah numeric

jadi jika ada site.com/webapp/contact

secara otomatis yg akan diproses oleh framework adalah


'<controller:\w+>/<action:\w>'=>'<controller>/<action>',

dia akan mencari pada SiteController.php yang memiliki class actionContact

sudah jelas kan mengenai urlManager

semoga membantu.

Mendeklarasikan Hubungan

Untuk memudahkan metadata db, maka hubungan antar tables juga perlu dijabarkan dalam models AR.

hubungan yang dijabarkan adalah hubungan antara key table 1 dan key table 2.<!–more–>

Hubungannya sendiri terbagi menjadi beberapa, yaitu :

  • satu-ke-banyak / satu-ke-satu = BELONGS_TO

(hubungan satu(1) record di tabel 1 miliki banyak(*)/satu(1) record di tabel 2)


1-----M/1

  • satu-ke-banyak = HAS_MANY

(hubungan satu(1) record di tabel 1 miliki banyak(*) record di tabel 2)


1-----M

  • banyak-ke-banyak = MANY_MANY (ada kemungkinan hubungan satu(1)/banyak() record di tabel 1 miliki satu(1)/banyak() record di tabel 2)

M-----M

  • satu-ke-satu = HAS_ONE (hubungan satu(1) record di tabel 1 meiliki tepat satu(1) record di tabel 2)

1-----1

dalam AR didekalarasikan dalam turunan relations


[relations()|CActiveRecord::relations]

contoh :


class Post extends CActiveRecord

{

	public function relations()

	{

		return array(

			'author'=&gt;array(self::BELONGS_TO, 'User', 'authorID'),

			'categories'=&gt;array(self::MANY_MANY, 'Category', 'PostCategory(postID, categoryID)'),

		);

	}

}


class User extends CActiveRecord

{

	public function relations()

	{

		return array(

			'posts'=&gt;array(self::HAS_MANY, 'Post', 'authorID'),

			'profile'=&gt;array(self::HAS_ONE, 'Profile', 'ownerID'),

		);

	}

}

ini tulisan sama persis di blog gw ^^ … hanya copy paste. maap kalo yg sudah pernah baca. tq

Jangan lupa sundul !!! wkwkwkwkw. tq gan.

makasih gan infonya…

cuma usul gan, biar lebih enak diliat coba nulis code nya dikasih insert code gan :)

beda format ternyata sama wordpress di wordpress pakenya <code></code> tapi disini pake [ code ][ /code ].

maklum cuman copy paste gan dari blogku.

next time dah gw edit dl ^^. tq sarannya gan

mantap gan, tapi ane setuju dengan oom fastcrash… agak melek dikit bacanya nih… di snip code aja ye…

Ok gan, dah gw edit2 biar bacanya lbh yahuut…

bantu vote ah…

btw, mungkin sekalian jelasin juga kapan save() dikasi parameter true atau false…

ama saveAttributes() soalnya ane rasa itu berguna banget…

Tq agan junxiong dah bantu vote :))

Sudah aku tambahkan tutorialnya gan diatas… mohon dikoreksi juga kalo aku salah ^^

bantu vote tutorialnya dunk, biar up terus di atas. tq

Saya jadi terpikir, sebetulnya kan ini cocok jadi cookbook buat Yii, cuman selama ini cookbook adanya hanya versi Inggris saja. Saya penasaran, apakah cookbook boleh dalam bentuk bahasa Indonesia juga gak yah…

Bikin cookbook dlm bahasa indonesia aku rasa gpp, ayo buat sendiri aja junxiong ^^. u karang … gw and teman2 support dari belakang ^^ hehehehe. gimana ?

sundul ah. vote dunk ^^

ini saya attch Bekerja Dengan Database Pada YII dengan bhs indonesia dan Query Builder1047

Bekerja Dengan Database Pada YII1.doc

wow… cookbook gitu kan kolaborasi… lagian masih gak lepel buat tutorial >.<

newbie nih…

ini salah satu contoh untuk DAO :


<?php


$sql=<<<EOD

SELECT t1.message AS message, t2.translation AS translation

FROM {$this->sourceMessageTable} t1, {$this->translatedMessageTable} t2

WHERE t1.id=t2.id AND t1.category=:category AND t2.language=:language

EOD;

		$command=$this->_db->createCommand($sql);

		$command->bindValue(':category',$category);

		$command->bindValue(':language',$language);

		$rows=$command->queryAll();

		$messages=array();

		foreach($rows as $row)

			$messages[$row['message']]=$row['translation'];


		if(isset($cache))

			$cache->set($key,serialize($messages),$this->cachingDuration);


		return $messages;

	

ini paging nya:


<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>

wew nih dia tutorial yang ane lagi mau cari… keren gan… ane praktekin dulu… nanti klo ane ada pertanyaan… tolong dibantu yah…

Bole la gan, selama masih dalam scope yang ane bisa. hehehe maklum, pengetahuannya masih terbatas.

mantap gan, ane blum pernah nyoba pake DAO, apa fitur-fitur bawaan AR-nya bisa dipakai gan? kaya searching, sorting, ajax paging , etc yang udah build-in di AR?

ah, bro junxiong bisa aja… :D

keliatannya itu di versi 1.1.6 baru akan ada (query builder). coba cek saja di Official yii framework repository atau Unofficial yii framework mirror repo for git users

Sedangkan untuk fungsi searching harus cek dulu widgetnya CLinkPager. setauku tidak mendukung untuk di combine dengan search options. ^^