Pada postingan sebelumnya, kita udah mulai pake ORM, selanjutnya, kita sekarang coba belajar membuat relasi has_one, has_many, dan belongs_to.

relasi has_one

Misalkan kita punya post yang mempunyai status, lalu kita buat table posts dan table statuses (plural dari post dan status).

table statuses:

id name
1 publish
2 draft
3 private

dan pada table posts:

id title status_id
1 title #1 3
2 title #2 1
3 title #2 2

Kemudian kita buat 2 buah model yaitu: Post_Model dan Status_Model.

// models/status.php
class Status_Model extends ORM {}

dan:

// models/post.php
class Post_Model extends ORM
{
  protected $has_one = array('status');
}

Untuk tau status dari sebah entry, kita tinggal pake ara sebagai berikut:

$posts = ORM::factory('post', 1)
  ->status->name;

Atau untuk memanggil semua entry pada table posts yang berstatuskan publish dengan cara:

$posts = ORM::factory('post')
  ->where('status_id', 1)
  ->find_all();

relasi has_many + belongs_to

Untuk relasi ini, contoh yang cocok adalah, setiap post mempunyai banyak komentar. Maka table post ini mempunyai property has_many comments. Kita ubah Post_Model menjadi:

// models/post.php
class Post_Model extends ORM
{
  protected $has_one = array('status');
  protected $has_many = array('comments');
}

note: pada has_one, isinya adalah singular model (disini adalah status, dan pada has_many, kita pake plural

Untuk table comments, fieldnya adalah:

id name post_id
1 arie 1
2 yudi 1
3 hendra 2

dan Comment_Model:

// models/comment.php
class CommentModel extends ORM
{
  protected $belongs_to = array('post');
}

untuk mendapatkan semua comment yang di post dengan id 1, kita bisa lakukan dengan:

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

lalu kita gunakan foreach untuk $comments, sehingga:

foreach ($comments as $comment)
{
  // proses
}

tentu aja kita mesti check dulu dengan method count(), apakah mempunyai comment atau gak