Fitur Relasi Active Record dalam Yii Framework (Bagian 1)
October 5th, 2011, Written by: | Categories: Programming, Tutorial, Yii Framework

Untuk menjelas bagaimana relasi Active Record berfungsi, mari kita ambil contoh. Penulis akan menggunakan contoh dari pembuatan blog (contoh mana lagi yang familiar bagi para Yii-ers kalau bukan Blog). Terdapat tiga tabel yakni tbl_post, yang menampung artikel blog, tbl_user yang menampung nama-nama pengarang, dan tbl_comment yang menampung komentar atas artikel blog.

Yii Framework

Yii Framework yang cepat, aman dan profesional

Post memiliki relasi dengan User. Sebuah Post juga memiliki relasi dengan Comment. Kira-kira seperti beginilah relasi mereka:

Desain ERD Pembuatan Blog

Desain ERD Pembuatan Blog


Dari situ kita bisa melihat bahwa satu Post dibuat oleh satu User. Tetapi seorang User bisa saja menulis beberapa Post. Satu Post bisa memiliki beberapa Comment. Tetapi Comment hanya mungkin merujuk ke satu Post.

Sekarang kita mulai mencoba membandingkan cara code tanpa framework versus code dengan Yii Framework. Misalkan kita ingin mengetahui Post dengan id 1 ditulis oleh siapa, maka apa yang harus kita lakukan?

Jika dengan code manual kita harus menulis query kira-kira seperti ini:

$query = "SELECT Author.* FROM Post JOIN Author ON Post.author_id = Author.id WHERE Post.id = 1";
$dataReader = mysql_query($query);
$data = mysql_fetch_array($dataReader);
echo $dataReader["name"];

Bandingkan dengan versi Yii

$post = Post::model()->findByPk(1);//kita perlu load Post id 1
echo $post->author->name; //voila! langsung cetak nama author!

Terlihat jelas siapa yang lebih cepat dan efisien. Bagi yang belum mengenali Yii mungkin penasaran, bagaimana itu mungkin bisa dilakukan?

Di dalam file Active Record (file-file yang terdapat di dalam folder /protected/models/), terdapat method relations() yang berfungsi untuk mengatur hubungan antar tabel. Yii menyediakan lima jenis relasi antar tabel untuk digunakan, yakni BELONGS_TO, HAS_MANY, HAS_ONE, MANY_MANY dan STAT. BELONGS_TO dan HAS_MANY merupakan yang paling sering digunakan.

 

BELONGS_TO

Kapan kita menggunakan BELONGS_TO? Ketika terdapat sebuah tabel dengan field foreign key. Contohnya seperti tabel Post yang memiliki field author_id(author_id merupakan foreign key yang merujuk ke tabel Author). Tabel Comment yang memiliki field post_id. Kita menggunakan BELONGS_TO untuk mendapatkan informasi field melalui foreign key itu. Contoh pemakaian:

//di model Post
public function relations()
{
	return array(
		'pengarang'=>array(self::BELONGS_TO, 'Author', 'author_id'),
	);
}
//cara pakai, misalnya dari Post ber-id 1, kita ingin tahu pengarang siapa
$post = Post::model()->findByPk(1);
$post->pengarang->name; //gunakan "pengarang" sesuai nama relasi.

Contoh setting relasi di Comment

public function relations()
{
	return array(
		'posts'=>array(self::BELONGS_TO, 'Post', 'post_id'),
	);
}

HAS_MANY

HAS_MANY merupakan kebalikan dari BELONGS_TO. Post memiliki author_id yang BELONGS_TO Author. Maka, Author HAS_MANY Post (Author memiliki banyak Post). Dengan mengeset HAS_MANY pada Author maka kita menjadi bisa mengetahui Author bersangkutan sudah menulis berapa buku.

Berikut contoh setting relasinya:

$author = Author::model()->findByPk(2); //cari pengarang yang memiliki id 2.
$daftarPost = $author->posts;
foreach($daftarPost as $post){ //harus melakukan looping kalau ingin mendapatkan nama post
	echo $post->name;
}

Mengapa harus menggunakan foreach untuk menampilkan informasi? Ini tidak lain dikarenakan hasil dari relasi HAS_MANY itu selalu dalam bentuk array. Oleh karena itu, kita biasanya selalu perlu melakukan looping (umumnya foreach) untuk mendapatkan nilainya.

Kesalahan yang sering dilakukan pemula dalam memanfaatkan HAS_MANY adalah langsung mengaksesnya. Akibatnya mendapatkan error seperti Trying to get property of non-object. Contoh code yang salah:

$author = Author::model()->findByPk(2); //cari pengarang yang memiliki id 2.
$daftarPost = $author->posts->name; //ERROR!!

 

Relasi Lainnya

Dengan dua relasi tersebut sebetulnya sudah memenuhi sebagian besar kebutuhan programmer. Karena sebagian besar desain database memang adalah dalam bentuk satu ke banyak(One to Many). Tetapi tidak menutup kemungkinan adanya satu ke satu (One to One). Di sinilah kita menggunakan HAS_ONE.

Selain itu, terkadang terdapat relasi antar dua tabel yang sifatnya banyak ke banyak (Many to Many). Jika Anda memiliki latar belakang database, maka pasti tahu tabel yang berelasi banyak ke banyak harus dibuat sebuah tabel penengah supaya di dalam desain tidak ada relasi banyak ke banyak sama sekali. Lagipula relasi banyak ke banyak adalah mustahil untuk dibuat di dalam database. Kalau demikian, mengapa Yii masih menyediakan relasi MANY_MANY?

Apa kegunaan STAT? Apakah dia ada hubungan dengan relasi database?

Pada artikel berikutnya penulis akan memaparkan fitur relasi Yii yang lain. Kalau ada sesuatu yang belum jelas mengenai artikel ini silahkan bertanya melalui komentar.

More about: , ,

Leave a Reply