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