Maap euy, kemaren blom sempet nulis lanjutan Kohana ORM, soalna gak enak badan. Sekarang juga baru masuk kantor.

Wokeh.. lansung aja!

relasi many to many aka has many and belongs to (hmabt)

Untuk relasi ini, salah satu contoh yang cocok adalah: post dan tag. Kita tau kalo post bisa punya banyak tags, dan setiap tag boleh di pake oleh banyak posts.

berikut adalah table untuk tags:

id name
1 blog
2 PHP
3 curhat

Btw, jangan protest ya kalo nama tag-nya curhat :P

dan isi untuk Tags_Model adalah:

// models/tag.php
class TagModel extends ORM
{
  protected $hasandbelongstomany = array('posts');
}

lalu kita update PostModel menjadi:

// models/post.php
class PostModel extends ORM
{
  protected $hasone = array('status');
  protected $hasmany = array('comments');
  protected $hasandbelongstomany = array('tags');
}

Disini kita perlu sebuah table lagi, yaitu table posts_tags, isinya hanya 2 buah field (buat map ke table posts dan tags) brikut:

postid tag_id

dua duanya kita masukan menjadi primary_key (ingat primary_key bukan field ya). Di MySQL bisa kita tulis dengan:

ALTER TABLE posts_tags ADD UNIQUE PRIMARY_KEY (tag_id, post_id)

Sebelum lebih jauh, kita mesti tambahkan beberapa entry baru kedalam tags (udah ada pada contoh table di atas, blog, PHP sama curhat).

Kita load sebuah entry pada postingan.

$post = ORM::factory('post', 1);

lalu kita add tags:

$post->add(ORM::factory('curhat'));
$post->add(ORM::factory('PHP'));
$post->save();

Untuk akses, kita bisa pake looping:

foreach ($post->tags as $tag)
{
  echo Kohana::debug($tag);
}

Kalo kita pengen tau ada berapa post yang pake tag curhat, dengan mudahnya kita pake:

$tag = ORM::factory('tag', 3);
echo $tag->posts->count();

foreach ($tag->posts as $post)
{
  echo $post->title;
}

Jika kita udah tau cara masukin relasi hmabt, skr kita bisa menghapus relasi itu dengan method remove();

$post->remove(ORM::factory('PHP'));
$post->save();

Selain posts-tags, kita juga bisa pake buat ACL. Misal:

$user = ORM::factory('user, 1);
if ($user->has(ORM::factory('role', 2)))
{
  echo 'YES';
}