[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.. 😀

[Review Book] Instant Building Multi-Page Forms with Yii How-to

Cover Image

For the third time pactk give me an apprecation to review their book. Now they ask me to try review book “Instant Building Multi-Page Form With Yii How To” from Udah Sawant. First, this book not a general Yii book that learn about all of Yii from installation until implementation. This book focuss to teach you about “how to make a multi page form in Yii Framework?”. What that mean about “multi page form”? Multi page form is a mechanism make a form (usually to insert/update data) that have some step. For example want insert my profile, in step 1 we insert name and address, step 2 upload my foto, step 3 upload my CV.

This book have 51 page and its good for you both beginners or not because this book will teach you from the basic of Yii Framework. Uday Sawant have been make the session group from the beginners, intermediate till advance. This is what will you learn :

– start with yii Fraemework and do some setting

– make a generate code CRUD operation (you will learn some concept about model, view and controller)

– create multipage  forms. So from the generate code CRUD operation, you will explode it become some form.

– Validate, you will learn to ensure your form run good when save data with validation.

– AJAX form. This is good point to learn because you can make better performance with this.

– Upload file, of course you must be know how to upload file to your server.

– Using multiple models, you will use this when your tabel have relations.

– Customising looks.

 

Thats it the session from the book. If you intereset with book, you can look it here,  so you can try it in your application . Hope it will help your code…

Happy Coding..

http://www.packtpub.com/building-multi-page-forms-yii/book

[PHP Mongodb] View And Modified Subset Field

Pada suatu collection, tidak jarang kita hanya ingin menampilkan atau memodifikasi sebagian data pada collection tersebut. Dan berikut cara yang dapat kita lakukan.

1. View Subset Field

//first array use to filter, second array for select where field we want to show.
//if second array is empty, then it will show all field in the colletion
$collection->find(array(),array('field1','field2'));

2. Update Subset Field

//use '$set' to do it
$collection->update(array('_id' => MongoId('your id field')),
array('$set' => array('field1' => 'Value From Field 1')));

Pada code di atas kita tidak ingin melakukan update pada semua field, tetapi hanya pada “field1” saja. Untuk itu kita gunakan ‘$set’ yang menandakan hanya akan mengeset field itu saja.

3. Delete Subset Field

//use '$unset' to do it and
$collection->update(array('_id' => MongoId('your id field')),
array('$unset' => array('field1' => True)));

Kita menggunakan ‘$unset’ untuk meng-unset nilai pada field yang terdapat pada array.

4. Rename Field Name

 $collection->update(array(),array('$rename' => array('jk' =>'jkelamin')));

Mungkin jika anda sudah terlanjut memberi nama field untuk jenis kelamin dengan “jk” lalu ingin menggantinya menjadi field “jkelamin” maka anda dapat menggunakan ‘$rename’

 

Itulah beberapa contoh memodifikasi subset field pada mongodb..

Finish… Happy Coding..

[PHP Mongodb] Upsert

Pada suatu kasus kita membuat sebuah field yang uniq. Dimana ketika dari field yang uniq tersebut ada nilai yang sama, maka opsinya adalah kita harus tidak dilakukan penyimpanan, tetapi pembaharuan data (update). Sebagai contoh kasus, kita memiliki colection “member” dimana memiliki field “id”,”email”,”name”,”address”. We make field “email” uniq and we save a data like this :

 $varvalue = array(
                'email' => 'youremail@email.com',
                'name' => 'Your Name',
                'address'=>'Your Address',
            );
            $collection->insert($varvalue,array('safe'=>true));

Lalu kita ingin menyimpan data lagi yang ternyata memiliki alamat email yang sama dengan data sebelumnya. Yah, maka dari itu kita harus membuat mekanisme kembali dimana mekanisme nya adalah :

if(email is unique)
   insert new data
else
   update old data that have same email

Yah, itulah mekanismenya. Tapi pada mongodb, kita tidak perlu repot memikirkan mekanisme tersebut. Telah ada sebuah operas bernama “upsert” yang akans secara otomatis menjalankan mekanisme tersebut. Berikut contoh codenya :

 
            $varvalue = array(
                'name' => 'Your Name',
                'address' => 'Your Address',
            );
            $collection->update(array('email' =>'youremail@email.com'),$varvalue,array('upsert'=>True));

You can see that we have “upsert”=>True in the update code. Itu artinya fungsi update tersebut akan menjalankan mekanisme berikut :

if(there's data that have same email)
    update old data that have same email with new "name" and "address"
else
    insert new data with "email", "name", and "address"

Finish.. Happy coding..

[ Yii Framework + MongoDb ] Update And Delete Data

Melanjutkan postingan sebelumnya di https://sabitlabscode.wordpress.com/2013/06/28/yii-framework-mongodb-select-collection-and-view/ sekarang kita akan mencoba membuat fungsi update dan delete. After all at least we can create a CRUD operation in Mongodb. Baiklah, pertama-tama mari kita create fungsi di model untuk mengeksekusi perintah update dan delete. Masukkan fungsi berikut pada model anda :

     public function editmongo($id) // udpdate data
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            //insert some value that we will change
            $varsiswa = array(
                'name' => $this->name,
                'jk' => $this->jk,
                'kota'=>$this->kota,
                'alamat'=>$this->alamat,
                'createddate' => new MongoDate()
            );
            //update data with parameter "_id" and insert value.
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to update data '.$e->getMessage());
        }
    }

    // function to delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->siswa;
            //delete data by document "_id"
            $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());
        }
    }

Setelah itu mari kita buat action pada controller dimana action inilah yang akan dijalankan untuk melakukan request. Pada controller masukkan code berikut :

     public function actionUpdate($id)
    {
        $model=new SiswaForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];
        $model->jk=$data['jk'];
        $model->kota=$data['kota'];
        if(isset($data['alamat']))
            $model->alamat=$data['alamat'];

        if(isset($_POST['SiswaForm']))
        {
            $model->name=$_POST['SiswaForm']['name'];
            $model->jk=$_POST['SiswaForm']['jk'];
            $model->kota=$_POST['SiswaForm']['kota'];
            $model->alamat=$_POST['SiswaForm']['alamat'];
            if($model->validate())
            {
                if($model->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('siswa',array('model'=>$model));    
    }

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

Dapat kita lihat pada action update dia me render halaman sedangkan delete tidak. Karena pada update me render halaman “siswa”, sedangkan halaman siswa sendiri sudah ada pada actionSiswa yang telah dibuat pada postingan sebelumnya. Jalankan fungsi tersebut..

Selesai.. happy coding…

[PHP Mongodb] Sort And Limit Query

Pada SQL terdapat cara untuk melakukan pengurutan dan pembatasan jumlah data yang akan di ambil, begitu juga pada mongodb. This is the way in PHP :

            
            $connection = new Mongo(); // make a definition mongodb
            $database = $connection->selectDB('belajar');  // get a database from mongodb
            $collection = $database->selectCollection('siswa');  // get a collection
            $result= $collection->find(); // query like "SELECT * FROM siswa"
            $result->sort(array('jk'=>1,'kota'=>-1));  // make a sort with field "jk" and "kota"
            $result->limit(2); // make a limit data that we want to get

Dapat anda lihat pada fungsi sort, terdapat beberapa data dalam bentuk array. Karena array, kita dapat mengurutkan datanya dari lebih dari 1 field. Kemudian dapat dilihat “jk”=>1 maksudnya adalah akan diurutkan dengan document “jk” dan ascending. Sedangkan jika dituliskan “-1” maka artinya diurutkan dengan descending. Anda dapat menentukan document yang digunakan untuk pengurutan dan menentukan juga ascending atau descendingnya..

Finish… Hope it help..
Happy coding…

[PHP Mongodb] Conditional Queries

Ada kondisi dimana kita ingin mencari data “lebih besar dari”, “lebih kecil dari”, dan lain-lain yang melibatkan nilai angka. Pada mongodb dengan PHP kita dapat menggunakannya dengan menggunakan Conditional Queries dimana terdapat beberapa jenis yang dapat kita gunakan diantaranya contohnya :

  • $gt = (greater than) sama dengan operator “>” pada sql
  • $lt = (lower than) sama dengan operator “<” pada sql
  • $gte = (greater than equal) sama dengan operator “>=” pada sql
  • $lte = (lower than equal) sama dengan operator “<=” pada sql
  • $ne = (not equal) sama dengan “<>” pada sql

Nah, itulah beberapa contoh operatornya. Dan berikut cara penggunannya pada code PHP :

$namaCollection->find(array('x' => array('$gt' => 100)));

$namaCollection->find(array('x' => array('$lt' => 100)));

$namaCollection->find(array('x' => array('$gte' => 100)));

$namaCollection->find(array('x' => array('$lte' => 100)));

$namaCollection->find(array('x' => array('$ne' => 100)));

Itulah beberapa contohnya. Dapat anda lihat, operator yang kita gunakan harus diapit dengan single quote ‘. Anda juga dapat membuat code untuk operator pencarian “between” dengan mengkombinasikan penggunan $gte dan $lte like this :

 
$namaCollection->find(array('x' => array('$gte' => 100, '$lte' => 200)));

Selesai, Selamat mencoba..

Happy coding..

%d bloggers like this: