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

Advertisements

[Yii Framework + Mongodb] Select Collection And View

From my previous post here https://sabitlabscode.wordpress.com/2013/06/28/yii-framework-mongodb-insert-value/, sekarang saya akan coba paparkan cara menampilkan suatu data dalam suatu collection dan bagimana menampilkan halaman detail dari suatu nilai. First, create fungsi baru di model “SiswaForm” yang telah kita buat tadi :

    //return all value from a collcetion
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            return $collection->find();
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    //find a value from collection by id
    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            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());
        }    
    }

Next, create dua buah action di controller. Action pertama digunakan untuk menampilkan all data from collection. Yang kedua untuk menampilkan detail data from collection yang telah kita pilih. Insert this code to controller :

    //action for show all data in a collection
    public function actionIndex()
    {
        $model=new SiswaForm;
        $data=$model->findallmongo();
        $this->render('index',array(
            'data'=>$data,
        ));
    }

    //action for show a detail data from collection
    public function actionView($id)
    {
        $model=new SiswaForm;
        $data=$model->findOneById($id);
        $this->render('view',array(
            'data'=>$data,
        ));
    }

Setelah selesai, kita akan create view untuk masing-masing action. Yang pertama adalah view “index” for actionIndex dan yang kedua adalah view “view” for actionView. Berikut adalah code view “index” :

<h1>Test Mongo - Siswa</h1>
<?php 
    while ($data->hasNext()):
        $siswa = $data->getNext(); 
?>
<h2><?php echo CHtml::link($siswa['name'],array('view','id'=>$siswa['_id'])); ?></h2>
<p><?php echo $siswa['kota']; ?></p>
<p><?php echo $siswa['jk']; ?></p>
<?php if(isset($siswa['alamat'])){ ?>
    <p><?php echo $siswa['alamat']; ?></p>
<?php } ?>
<?php endwhile; ?>

Kemudian berikut adalah view “view”

<h1>Test Mongo - Siswa</h1>
<h2><?php echo $data['name']; ?></h2>
<p><?php echo $data['kota']; ?></p>
<p><?php echo $data['jk']; ?></p>
<?php if(isset($data['alamat'])){ ?>
    <p><?php echo $data['alamat']; ?></p>
<?php } ?>

Selesai… You can run your application now..

Happy coding..

[Yii Framework + Mongodb] Insert Value

Berikut adalah contoh melakukan insert data ke dalam mongodb dengan menggunkan Yii Framework. Sebelumnya perlu anda ketahui pada Yii Framework sendiri telah ada extension yang bagus digunakan untuk mengoneksikan Yii dengan Mongodb yaitu Yiimongodbsuite yang dapat anda lihat di http://www.yiiframework.com/extension/yiimongodbsuite/. Tetapi untuk postingan kali ini saya tidak menggunakan extension tersebut. Dengan begitu code ini dapat diimplementasikan baik di Yii, framework PHP lain, maupun menggunakan pure PHP.

Sebelum memulai, pastikan bahwa server anda telah memiliki driver untuk mongodb, jika belum silahkan install. Pertama-tama buatlah database, lalu collection seperti postingan ini. Lalu dengan mengacu collection tersebut, buatlah sebuah model pada Yii Framework dengan nama “SiswaForm”, masukkan code berikut :

<?php

class SiswaForm extends CFormModel
{
  public $name;
  public $jk;
  public $kota;
  public $alamat;
  public $createddate;

  public function rules()
  {
     return array(
        array('name', 'required'),
     );
  }

  public function attributeLabels()
  {
     return array(
        'name'=>'Name',
        'jk'=>'Sex',
        'kota'=>'City',
        'alamat'=>'Address',
        'createddate'=>'Crated Date',
     );
   }

  //digunakan untuk menyimpan data pada mongodb
  public function savemongo()
  {
     try {
       //memanggil class mongodb, secara default port mongodb adalah 27071. Jika portnya berbeda, maka 
       //anda perlu melakukan konfigurasi lagi pada code. Find it on google.
       $connection = new Mongo();
       //menentukan dataabase mana yang akan kita gunakan.
       $database = $connection->selectDB('belajar');
       //mendefinisikan suatu collection ke dalam variabel
       $collection = $database->selectCollection('siswa');
       // memasukkan nilai-nilai ke dalam collection
       // jika anda menggunakan code selain Yii. Just change the value with your value.
       $varsiswa = array(
          'name' => $this->name,
          'jk' => $this->jk,
          'kota'=>$this->kota,
          'alamat'=>$this->alamat,
          'createddate' => new MongoDate() // this is for insert an automatic date from mongodb
       );
       //save data
        $collection->insert($varsiswa,array('safe'=>true));
        return true;
     }
     catch(MongoConnectionException $e) { 
        //let you know when it failed connect to your database
        die("Failed to connect to database ".$e->getMessage());
     }
     catch(MongoException $e) {
        // let you know when we failed to insert data.
        die('Failed to insert data '.$e->getMessage());
     }
   }
}

Code di atas digunakan untuk menyediakan inputan data yang akan dimasukkan ke dalam mongodb collection. Juga terdapat fungsi “savemongo()” dimana fungsi tersebutlah yang akan menyimpan data ke dalam mongodb collection. Penjelasan dari code tersebut dapat anda lihat pada komentar nya.

Setelah itu buatlah sebuah action seperti berikut :

    public function actionSiswa()
    {
        $model=new SiswaForm;
        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->savemongo())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('siswa',array('model'=>$model));
    }

Lalu terakhir, buatlah view “siswa” dengan membuat viewnya dan masukkan code berikut :

<h1>Test Mongo - Siswa</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,'name'); ?>
        <?php echo $form->textField($model,'name'); ?>
        <?php echo $form->error($model,'name'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'jk'); ?>
        <?php echo $form->textField($model,'jk'); ?>
        <?php echo $form->error($model,'jk'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'kota'); ?>
        <?php echo $form->textField($model,'kota',array('size'=>60,'maxlength'=>128)); ?>
        <?php echo $form->error($model,'kota'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'alamat'); ?>
        <?php echo $form->textArea($model,'alamat',array('rows'=>6, 'cols'=>50)); ?>
        <?php echo $form->error($model,'alamat'); ?>
    </div>
    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

Selesai,.. Jalankan aplikasi anda. Untuk melihat apakah data yang diinsert berhasil atau tidak, lihatlah melalui command prompot anda (bila tidak tahu lihat tutorial saya sebelumnya)..

Happy coding..

[Mongodb] Create, Insert And Select Document In Collection

Pertama untuk mendefinisikan sebuah database masukkan code berikut kedalam command prompt anda :

use namadatabase

Lalu untuk memasukkan data baru ke dalam sebuah collection, buatlah code berikut ke dalam command prompt anda :

> db.siswa.insert({name:"Sabit Huraira",jk:"Laki-laki",kota:"1"})
> db.siswa.insert({name:"Fithri Selva",jk:"Perempuan",kota:"2"})
> db.siswa.insert({name:"Fariko",jk:"Perempuan",kota:"3",alamat:"Palembang"})

Dapat anda lihat pada baris 1 dan 2 kita menginput data dengan document yang sama. Sedangkan pada baris ke 3 kita menginput dengan document baru yaitu “alamat”. Itulah salah satu kelebihan mongodb..

Jika anda ingin melhat data yang telah diinput, masukkan command berikut :

> db.siswa.find()

Lalu akan muncul hasil seperti berikut :

 
{ "_id" : ObjectId("51cc2f21bd6570d7b8966faa"), "name" : "Sabit Huraira", "jk" :
 "Laki-laki", "kota" : "1" }
{ "_id" : ObjectId("51cc2f47bd6570d7b8966fab"), "name" : "Fithri Selva", "jk" :
"Perempuan", "kota" : "2" }
{ "_id" : ObjectId("51cc2fadbd6570d7b8966fac"), "name" : "Fariko", "jk" : "Perem
puan", "kota" : "3", "alamat" : "Palembang" }
>

Selesai.. Happy coding..

[Yii Framework] How To Call Widget With Smarty Template

Kebetulan ada kerjaan yang menggunakan smarty dan Yii Framework. Walau ada beberapa perbedaan dengan menggunakan syintax PHP biasa, tetapi penggunaan smarty tidak sulit untuk dipelajari. Tetapi ketika mencoba memanggil sebuah widget Yii menggunakan smarty, awal nya menggunakan code seperti berikut :

{$this->widget(‘listsmarty’, array(‘textnya’=>$textnya]))}

kemudian muncul pesan error yang mengatakan kesalahan penggunaan syntaxt quote bla bla bla.. Ternyata pada smarty penggunan syntaxt yang mengandung array() harus diganti dengan menggunakan kurung siku “[]” sehingga kode nya menjadi seperti berikut :

{$this->widget(‘listsmarty’, [‘textnya’=>$textnya])}

Tetapi setelah kode di atas dijalankan, ternyata masih menyisakan error yang mengatakan bahwa class “listsmarty” tidak dapat di konversi ke dalam bentuk string. Tetapi ternyata kode tersebut dapat dijalankan dengan lancar setelah digunakan kode berikut :

{$this->widget(‘listsmarty’, [‘textnya’=>$textnya],true)}
Setelah itu kode akan menampilkan widget yang kita inginkan.. Tentu hal tersebut juga berlaku untuk cgridview, clistview..

Selesai.. Semoga bermanfaat…

Happy coding..

Auto Increment Trigger Oracle Not Work With Yii Framework Active Record

Sebelumnya saya telah memaparkan bagaimana cara membuat sebuah auto increment pada oracle disini. Tetapi setelah di implementasikan langsung dengan menggunakan Yii Framework ternyata trigger tersebut tidak berjalan. Perlu diketahui fungsi ini tidak berjalan ketika menggunakan active record pada Yii. Sedangkan jika anda menggunakan query builder atau DAO ini tidak masalah.  Saya menemukan hal ini dengan menggunakan Yii Framework versi 1.1.13, semoga versi selanjutnya dapat menyelesaikan masalah ini..

Mengapa tidak berjalan ? berikut alur kerja penyimpanannya menggunakan active record :

– kita mendefinisikan model

– memasukkan data

– menyimpan data , pada proses ini seharusnya sesaat sebelum insert data Yii sudah menjalankan trigger yang telah kita buat sebelumnya. Tetapi ternyata dia tidak melakukan hal tersebut melainkan langsung menyimpan dan menyebabkan error. Andaikata kita menyisipkan sebuah nilai pada field auto increment tadi, maka setelah penyimpanan berhasil dilakukan tetapi nilai dari field auto increment akan mengikuti nilai sequence kita.

Untuk mengatasi hal tersebut, maka saya putuskan untuk menghilangkan trigger yang ada pada oracle, dan membuat sendiri fungsi pada Yii yang akan selalu dijalankan sebelum proses insert data baru terjadi. Caranya cukup mudah, cukup sisipkan code beforeValidate pada model anda seperti berikut :

    public function beforeValidate()
    {
        if(Yii::app()->db->driverName=="oci")
        {

            $connection = Yii::app()->db;
            if($this->primaryKey==NULL)
            {            
                $sql = "select nama_sequence_anda.NEXTVAL from DUAL";
                $command = $connection->createCommand($sql);
                $this->primaryKey = $command->queryScalar();

            }
        }
        return parent::beforeValidate();
    }

Fungsi di atas akan selalu dijalankan sebelum data divalidasi. Pada fungsi tersebut dapat anda lihat kita melakukan cek terlebih dahulu apakah database yang dituju adalah oracle atau bukan. Kemudian ketika primary key dari data yang kita input adalah NULL (artinya dia data baru, dan tidak dijalankan untuk fungsi update) maka dia akan mengambil nilai terakhir dari sebuah sequence yang telah kita buat sebelumnya dan menyisipkannya ke dalam nilai primary key..

Auto Increment In Oracle

Bagi anda yang terbiasa menggunakan MySql dalam membangung aplikasi, mungkin sudah tidak asing lagi dengan istilah auto increment. Auto increment sendiri adalah penandaan suatu field agar setiap kali kita insert data maka field tersebut tidak perlu lagi diinput melainkan akan secara otomatis diinput dengan sebuah nilai angka yang berurutan. Misal ada field “id” dan “nama”, dimana field  “id” adalah auto increment. Ketika insert data, kita hanya perlu memasukkan nilai “nama” saja di dalam field tersebut, sedangkan field “id” akan terisi otomatis dengan suatu nilai angka yang selalu berurutan misal 1, selanjutnya 2 selanjutnya 3 dan seterusnya.

Nah, ketika anda menggunakan oracle fitur auto increment tidaklah sesederhana itu. Oracle sendiri tidak menyediakan secara langsung sebuah tipe seperti itu (auto increment).  Maka dari itu kita perlu menyisipkan suatu script di dalam oracle database untuk membuatnya dapat bekerja seolah-olah memiliki tipe auto increment.

Pertama-tama buatlah sebuah sequence pada database anda.

CREATE SEQUENCE nama_sequence
    INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER;

Kemudian buatlah sebuah trigger dimana trigger tersebut akan selalu dijalnkan sebelum kita menyimpan suatu data baru ke tabel tersebut :

create or replace 
TRIGGER nama_trigger 
    BEFORE INSERT ON nama_tabel_anda 
      FOR EACH ROW
      BEGIN
         SELECT nama_sequence.NEXTVAL
         INTO   :new.nama_field_yang_akan_dibuat_auto_increment
         FROM   dual;
      END;

Selesai, untuk memastikan apakah sudah auto increment atau belum, cobalah menginput sebuah data dimana anda mengosongkan field yang telah anda buat auto increment pada oracle…

%d bloggers like this: