[PHP Yii Mongodb] Work With Data Relation

Pada rdbms biasanya kita sudah tidak asing dengan istilah tabel relation yang membuat hubungan antara dua tabel atau lebih. Bagaimana dengan mongodb? bukankah mongodb adalah nosql bukan “relational DBMS”? Ya, mongodb juga telah mengakomodasi hal tersebut walaupun tidak persis sama dengan yang dimiliki pada rdbms. Ada 2 cara untuk mengimplementasikannya di dalam mongodb.

1. Membuat field relasi langsung.

Ini sama dengan yang biasa kita lakukan pada rdbms, dimana kita membuat field pengubung (foreign key) pada suatu tabel untuk membuat hubungan antar tabel.

2. Memasukkan data ke dalam document langsung.

Sebenarnya ini bukanlah membuat relation ke dalam tabel, tapi kita memasukkan langsung data-data ke dalam sebuah document. Sebagai contoh dalam mysql kita memiliki tabel “berita” dan “komentar” dimana berita dapat memiliki banyak komentar. Hubungan antara keduanya berita dapat memiliki lebih dari satu komentar, dan komentar hanya memiliki satu buah berita. Pada rdbms kita membuatnya dengan dua buah tabel seperti berikut :

– tabel 1 = > berita : id, judul, isi berita

– tabel 2 => komentar : id, judul komentar, isi komentar, berita_id (foreign key)

pada mongodb, kita dapat memasukkannya langsung ke dalam document berita menjadi seperti berikut :

– document berita : id, judul, isi berita, komentar [id, judul, isi komentar]

Tetapi perlu dipahami kasus-kasus dimana kita lebih baik menggunakan cara 1 atau cara 2.

Ok, sekarang kita coba langsung implementasinya. Pada postingan kali ini akan dibahas penggunaan cara 1, maybe next time akan membahas cara 2.  Kita memiliki 3 buah document :

– siswa : id, nama

– pelajaran : id, nama pelajaran

– nilai : id, siswa_id, pelajaran_id, nilai

Anggaplah kita sudah membuat operasi CRUD untuk document “siswa” dan “pelajaran” (if you dont know how to do it, search it here https://sabitlabscode.wordpress.com/tag/mongodb/). Okeh, sekarang buatlah sebuah model nilai seperti berikut :

 <?php

class NilaiForm extends CFormModel
{
    //define variable in 
    public $pelajaran_id;
    public $siswa_id;
    public $nilai;

    // rule validation
    public function rules()
    {
        return array(
            array('pelajaran_id, siswa_id, nilai', 'required'),
        );
    }

    //attribute label in form
    public function attributeLabels()
    {
        return array(
            'pelajaran_id'=>'Pelajaran',
            'siswa_id'=>'Siswa',
            'nilai'=>'Nilai'
        );
    }

    //run it for save data
    public function savemongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => new MongoId($this->pelajaran_id),
                'siswa_id' => new MongoId($this->siswa_id),
                'nilai'=>$this->nilai
            );
            $collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for update data
    public function editmongo($id)
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => $this->pelajaran_id,
                'siswa_id' => $this->siswa_id,
                'nilai'=>$this->nilai
            );
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            //$collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->nilai;
            $collection->remove(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to do operation '.$e->getMessage());
        }
    }

    // this will return all data from document nilai
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $result= $collection->find();

            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            return $collection->findOne(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }
}

Setelah itu, buatlah controller untuk request pada aplikasi :

 <?php

class NilaiController extends Controller
{
    // action index to see all data in document nilai
    public function actionIndex()
    {
        $model=new NilaiForm;
        $data=$model->findallmongo();

        // mongodb cant do join, so we need to call model "pelajaran" and "siswa"
        // to show all field that owned by "pelajaran" and "siswa" 
        $m1=new PelajaranForm; 
        $m2=new SiswaForm;
        $this->render('index',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));
    }

    // it will show detail data from tabel "nilia"
    public function actionView($id)
    {
        $model=new NilaiForm;
        // call a data from model "nilai"
        $data=$model->findOneById($id);
        $m1=new PelajaranForm;
        $m2=new SiswaForm;

        $this->render('view',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));

    }

    // it use for create new data
    public function actionCreate()
    {
        $model=new NilaiForm;
        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];
            $model->nilai=$_POST['NilaiForm']['nilai'];
            if($model->validate())
            {
                if($model->savemongo())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));
    }

    // update data
    public function actionUpdate($id)
    {
        $model=new NilaiForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];

        $model->pelajaran_id=$data['pelajaran_id'];
        $model->siswa_id=$data['siswa_id'];
        $model->nilai=$_POST['NilaiForm']['nilai'];

        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];

            if($model->validate())
            {
                if($model->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));    
    }

    // delete data
    public function actionDelete($id)
    {
        $model= new NilaiForm;
        $model->deletemongo($id);
        $this->redirect(array('index'));
    }
}

Kemudian aturlah tampilan datanya. Ini adalah tampilan untuk actionIndex,

 <h1>Test Mongo - Nilai</h1>
<?php 
    while ($data->hasNext()):
        $siswa = $data->getNext(); 

$pelajaran=$m1->findOneById($siswa['pelajaran_id']);
$sisw=$m2->findOneById($siswa['siswa_id']);
?>

<b>
<?php echo CHtml::link($pelajaran['name'],array('view','id'=>$siswa['_id'])); ?> | 
<?php echo CHtml::link($sisw['name'],array('view','id'=>$siswa['_id'])); ?>
</b>
[[
<?php echo CHtml::link('Update',array('update','id'=>$siswa['_id'])) ?> |
<?php echo CHtml::link('Delete',array('delete','id'=>$siswa['_id'])) ?>
]]<br/>
<?php endwhile; ?>

Ini tampilan untuk actioncreate dan actionupdate

 <h1>Test Mongo - Pelajaran</h1>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p>Fields with <span>*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <div>
        <?php echo $form->labelEx($model,'pelajaran_id'); ?>
        <?php echo $form->dropDownList($model,'pelajaran_id',PelajaranForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'pelajaran_id'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'siswa_id'); ?>
        <?php echo $form->dropDownList($model,'siswa_id',SiswaForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'siswa_id'); ?>
    </div>

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

dan ini adalah tampilan untuk actionView

 <h1>Test Mongo - Nilai</h1>
<?php
$pelajaran=$m1->findOneById($data['pelajaran_id']);
$sisw=$m2->findOneById($data['siswa_id']);
echo $pelajaran['name'];
echo $sisw['name'];
?>

Anda dapat pelajari penjelasan code-code tersebut dari komentar yang ada pada code dan postingan sebelumnya tentang mongodb..

Selesai.. Hope it help..

Happy coding..😀

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: