[PHP Yii Mongodb] Work With Data Relation
July 14, 2013 Leave a comment
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.. 😀
Komentar