Kohana ORM

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 TagsModel 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 poststags, isinya hanya 2 buah field (buat map ke table posts dan tags) brikut:

postid | tag_id

dua duanya kita masukan menjadi primarykey (ingat `primary_key bukan field <http://tech.groups.yahoo.com/group/id-php/message/30489>`__ ya). Di MySQL bisa kita tulis dengan: ALTER TABLE poststags ADD UNIQUE PRIMARYKEY (tagid, 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 sebah 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';
}