2 minutes
Kohana ORM #3
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';
}