[Yii Framework] View data dengan Pure SQL Command

Banyak orang merasa kesulitan ketika ingin menampilkan data dari database yang sesuai dengan keinginan mereka pada Yii Framework. Yah, hal itu wajar mengingat banyak orang menggunakan Generate Code otomatis pada Yii yang membuat kita merasa kesulitan mempelajari dan meng custom code tersebut jika  diperlukan. Tapi saya rasa tidak demikian jika kita telah mengerti code-code yang di hasilkan pada Yii. Saya akan contohkan kasus untuk menampilkan sesuatu sesuai dengan keinginan kita menggunakan SQL Command yang kita buat sendiri. Pada kasus ini saya akan tunjukkan cara menampilkan suatu kumpulan data yang ada pada databae dengan SQL command..

Okeh, saya ambil contoh untuk mengedit tampilan halaman Index suatu tabel dengan menggunakan SQL. Misal, sebelumnya controller pada “actionIndex” saya memiliki code seperti berikut:

        public function actionIndex()
	{
		$dataProvider=new CActiveDataProvider('Dua');
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
		));
	}

Saya ingin menampilkan data yang sama pada kasus ini, tapi dengan SQL command. Yak, saya rubah code di atas menjadi seperti berikut:

	public function actionIndex()
	{
		$sql="SELECT * FROM DUA";
		$dataProvider=new CSqlDataProvider($sql,array(
			'keyField' => 'duasatu',
		));
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
		));
	}

Penjelasan : Dapat anda lihat disana saya menampilkan nya dengan menggunakan suatu command SQL. Lalu saya masukkan Primari Key nya di dalam attribute “keyField”. Selesai.. kedua code tersebut sama-sama akan menghasilkan hasil yang sama…

Hanya permasalahan kita disini adalah cara menampilkannya. Pada contoh code pertama, Yii Framework akan mengembalikan nilai yang sudah di generate otomatis menjadi sebuah object-object yang sudah di deklarasikan pada “Model”. Sedangkan cara kedua belum.. Untuk itu ada beberapa code pada bagian “Views” yang harus kita ubah..

Buka bagian view controller yang anda maksud. Karena kita sedang mengotak-atik pada “actionIndex”, silahkan buka index.php. Pada code index.php sendiri tidak ada yang perlu kita ubah, karena code index.php sendiri langsung mengarah ke “_view.php”. Nah, sekarang silahkan buka “_view.php”. Akan ada code berikut:

<div class="view">
	<b><?php echo CHtml::encode($data->getAttributeLabel('namaAttribute1')); ?>:</b>
	<?php echo CHtml::link(CHtml::encode($data->namaAttribute1), 
            array('view', 'id'=>$data->namaAttribute1)); ?>
	<br />

	<b><?php echo CHtml::encode($data->getAttributeLabel('namaAttribute2')); ?>:</b>
	<?php echo CHtml::encode($data->namaAttribute2); ?>
	<br />
</div>

Untuk bisa mengakses variabel yang di tangkap dari SQL command tadi, anda dapat ubah code di atas menjadi seperti berikut:

<div class="view">
	<b>Nama Attribute1 :</b>
	<?php echo CHtml::link(CHtml::encode($data['namaAttribute1']), 
          array('view', 'id'=>$data['namaAttribute1']));  ?>
	<br />

	<b>Nama Attribute2 :</b>
	<?php echo CHtml::encode($data['namaAttribute2']); ?>
	<br />
</div>

Yah, tidak terlalu banyak yang harus kita ubah.. Dan code di atas akan menampilkan semua data sesuai dengan yang kita perintahkan dari SQL kita, yaitu seperti berikut…

Selesai… Selamat mencoba…

Semoga membantu😀

47 Responses to [Yii Framework] View data dengan Pure SQL Command

  1. teguh says:

    itu kan kalo di viewnya menggunakan CListView, kalo ingin menggunakan CGridView gimana ya kira2?
    maaf nih masih belajar Yii

  2. sabitzhabit says:

    gini gan :
    $this->widget(‘zii.widgets.grid.CGridView’, array(
    ‘dataProvider’=>$dataProvider,
    ‘columns’=>array(
    array(
    ‘name’=>’Identitas’,
    ‘value’=>’$data[“namaAttribute1”]’,
    ),
    array(
    ‘name’=>’Nama’,
    ‘value’=>’$data[“namaAttribute2”]’,
    ),
    ),
    ));

    • teguh says:

      gan, ane ada masalah lagi ni.
      kan ane ngelakuin pake query select menggunakan join, hasilnya dah tampil.
      di page pertama dah baik2 aja, tabel dengan data yang diinginin dah muncul. tapi pas di klik page ke dua, tabelnya ilang, ga munculin apa2.
      itu apa permasalahnnya ya gan?
      makasih nih atas respondnya.

    • sugeng says:

      om sabit,smua jalan tapi searchnya kok gak bisa ya…bag mana lagi yg perlu diubah??? (di halaman admin)

  3. teguh says:

    mas saya dah coba tutorial diatas, dan dah berhasil, tapi kenapa kalo daya yang ingin ditampilin lebih dari 10 data, kenapa hanya 10 data doang ya yg ditampilin, trus link buat halaman juga ga muncul.
    mohon bantuannya ya mas..

  4. sabitzhabit says:

    sori baru bales gan:
    tambahin aja code paginationnya gan, kek gini:
    $dataProvider=new CSqlDataProvider($sql,array(
    ‘keyField’ => ‘duasatu’,
    ‘pagination’=>array(
    ‘pageSize’=>2,
    ));

  5. teguh says:

    siip mas dah bisa…
    wah makasih banget ni..
    tapi ada lagi yg mau di tanyain..
    hehehehe…

    saya ingin membuat tabel sendiri dengan tag html biasa, tapi datanya itu dari $dataProvider.
    saya dah coba2 tapi ga berhasil2 ya mas..
    ada pencerahan ga ni?

  6. teguh says:

    oiya saya dah coba membuat menggunakan CListView, tapi header dari tabelnya selalu berulang setiap record.
    kalo saya menggunakan CGridView, itu gimana ya mas?

  7. sabitzhabit says:

    klo kasus kayak gtu, di transfer dlu aja gan nilainya ke dalam array. COba liat dsini : https://sabitlabscode.wordpress.com/2011/07/23/yii-framework-membuat-slider/

  8. teguh says:

    maaf ni gan ane mau tanya lagi.
    itu pake ClistView apa pake CGridView?
    ane bener2 ga ngerti nih gan.
    ane dah coba pake CListView dengan perulangan foreach, tapi yg muncul cuma 10 karena di pagination pagesize ane definisiin 10, kan padahal datanya banyak.

  9. sabitzhabit says:

    pake keduanya bisa gan.. coba liat coding ny gan..

  10. teguh says:

    ni di viewnya gan
    foreach($dataProvider->getData() as $i=>$ii)
    {
    echo $ii[‘date_created’];
    echo $ii[‘app’];
    echo $ii[‘keyword’];
    echo $ii[‘operator’];
    echo $ii[‘success’];
    echo $ii[‘failed’];
    echo $ii[‘tipe’].””;
    }

  11. teguh says:

    ini di controllernya gan.
    $dataProvider=new CSqlDataProvider($sql,array(
    ‘keyField’ => ‘id_report’,
    ‘totalItemCount’ => $count,
    ‘pagination’ => array(‘pageSize’=>100,),
    ));
    $this->render(‘all_report’,array(‘dataProvider’=>$dataProvider,));

  12. sabitzhabit says:

    sory baru bales gan..
    kalo di controller nya agan udah bener itu gan, cuma di tampilannya agan nampilinnya pake code PHP biasa(ga pake control dari Yii kek Cgridview/clistview) sehingga paginationnya ga secara otomatis di buat..
    jadi kalo pake cara itu agan mau ga mau harus buat pagination manual gan di view nya..

  13. afif says:

    kalo tabel yang di SQL-nya lebih dari satu keyfieldnya ngambil yang mana & gimana?

  14. coba jalanin aja sql yg pake join nya langung di phpmyadmin misal, trus ngakses field nya ya pake $data[‘namaYangmunculdiphpmyadminnya’]

  15. Gazza says:

    Maaf mas, saya menggunakan CDetailView,
    Ada error di datapProvider nya ‘Undefined variable: dataProvider’
    Padahal kalau pakai CListView nggak ada masalah.
    Bisa tolong dibantu?
    Kemudian untuk menampilkan attribute nya apakah sudah benar?Tks sebelumnya.
    Berikut codingnya:

    widget(‘zii.widgets.CDetailView’, array(
    ‘dataProvider’=>$dataProvider,
    ‘attributes’=>array(
    ‘cnama’,
    ‘cnik’,
    ‘nGapok’,
    ‘nTJab’,
    ‘nInsentif’,
    ‘dCreate’,
    ‘dModify’,
    ‘lAktif’,
    //’idpegawai’,
    ),
    )); ?>

  16. untuk nampilin masing2 field nya dibuat seperti ini :

    widget(‘zii.widgets.CDetailView’, array(
    ‘dataProvider’=>$dataProvider,
    ‘attributes’=>array(
    array(
    ‘name’=>’namaAttribute’,
    ‘value’=>’$data[“namaAttribute”]’,
    )
    ),
    )); ?>

  17. Gazza says:

    Mas, ada contoh yang tidak menggunakan Active Record nggak (yg murni sql) dan pake lebih dari 1 tabel, termasuk save dan updatenya. Bahasa Inggris jg gpp….maklum sudah tua baru belajar….lemot….
    thx

  18. wah, saya ga pernah juga mas pake SQL biasa.. kalo mas emang mau pake SQL biasa, mungkin cari nya di PHP biasa aja mas.. tapi di implementasiin di Yii.. Soalnya di Yii kebanyakan pake active record karena gampang untuk pagianation dll..

  19. Gazza says:

    Maksud saya seperti contoh yang mas tulis ini, pake sql command, dengan beberapa table, dan bisa update/save. Kalau yg 1 tabel menggunakan AR, sy sudah bisa. Hanya untuk multi table, belum ok. Saya terbiasa menggunakan sql command, makanya kalau ada contohnya saya mau deh….biar saya bisa oprek-oprek……thx a lot…

  20. tinggal mas masukin aja mas SQL join nya ke dalam SQL yang ada di atas mas.. sama aja jalannya..

  21. Gazza says:

    Sudah mas, itu sudah bisa.
    Begini, saya membuat model dan crud dari tabel pegawai dan mastergaji.
    Sudah jalan, hanya data yang tampil hanya dari mastergaji, padahal kan seharusnya ada juga dari tabel pegawai. padahal relasinya sudah terbentuk.

    Nah, dari contoh di atas saya buat sql commandnya di actionindex, dan bisa tampil.
    Hanya untuk proses save/update record di mastergaji, apa lagi yang perlu saya rubah/sesuaikan ya….

    thx a lot…..

  22. kalo untuk operasi save atau update jauh lebih enak menggunakan active record mas. Misal mau simpen data pegawai, jadi :

    $model=new Pegawai;
    $model->nama=’Bababa’;
    $model->umur=’30’;
    $model->save();

    gitu aja mas… saya malah ga pernah pake SQL query saat insert/update kalo pake Yii mas..

  23. Gazza says:

    ok, makasih atas supportnya.
    Ini saya sedang coba mempelajari active record relational, dari sini:
    http://code.google.com/p/yii/source/browse/trunk/docs/guide/id/database.arr.txt?r=3525
    mudah-mudahan otak saya masih bisa nyambung,
    klu masih nggak bisa nanti sy tanya lagi dehh….hehehe…
    jangan bosan ya mas, thx….

  24. Gazza says:

    mas, sy menampilkan data ke grid, dengan pure sql command. sudah bisa, tetapi
    yang ini:

    array(
    ‘class’=>’CButtonColumn’,
    ),

    tidak bisa digunakan, errornya-> Property “CGridView.0″ is not defined.

    punya saran?
    Saya punya dua table

    CREATE TABLE `mastergaji` (
    `idMGaji` int(11) NOT NULL AUTO_INCREMENT,
    `nGapok` decimal(15,0) DEFAULT NULL,
    `nTJab` decimal(15,0) DEFAULT NULL,
    `nInsentif` decimal(15,0) DEFAULT NULL,
    `dCreate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `dModify` datetime DEFAULT NULL,
    `lAktif` tinyint(1) NOT NULL DEFAULT ‘0’,
    `idpegawai` int(11) DEFAULT NULL,
    PRIMARY KEY (`idMGaji`),
    KEY `idpegawai` (`idpegawai`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

    #
    # Dumping data for table mastergaji
    #

    LOCK TABLES `mastergaji` WRITE;
    /*!40000 ALTER TABLE `mastergaji` DISABLE KEYS */;
    INSERT INTO `mastergaji` VALUES (1,2000000,500000,250000,’2012-03-26 12:35:11′,NULL,1,1);
    /*!40000 ALTER TABLE `mastergaji` ENABLE KEYS */;
    UNLOCK TABLES;

    #
    # Source for table pegawai
    #

    DROP TABLE IF EXISTS `pegawai`;
    CREATE TABLE `pegawai` (
    `cnik` varchar(12) NOT NULL DEFAULT ”,
    `cnama` varchar(60) DEFAULT NULL,
    `dmulaikerja` date DEFAULT NULL,
    `unitkerja` varchar(5) DEFAULT NULL,
    `jabatan` varchar(50) DEFAULT NULL,
    `cNPWP` varchar(30) DEFAULT NULL,
    `cBANK` varchar(30) DEFAULT NULL,
    `cNOREK` varchar(30) DEFAULT NULL,
    `cNOREK_AN` varchar(60) DEFAULT NULL,
    `cJAMS` varchar(30) DEFAULT NULL,
    `cno_ktp` varchar(30) DEFAULT NULL,
    `idpegawai` int(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`idpegawai`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

    #
    # Dumping data for table pegawai
    #

    LOCK TABLES `pegawai` WRITE;
    /*!40000 ALTER TABLE `pegawai` DISABLE KEYS */;
    INSERT INTO `pegawai` VALUES (‘10010005′,’Alya’,’2010-07-01′,’HO’,’Manager’,”,’02S12345678′,’BCA’,’0271234567′,’Alya’,’020202′,’6472052312880001′,1);
    INSERT INTO `pegawai` VALUES (‘10010006′,’Dina Aladin’,’2010-12-25′,’HR’,’HR Spv’,”,’02s12436546412′,’BCA’,’027111111′,’Dina Aladin’,’0212′,’67205212222222222′,2);
    /*!40000 ALTER TABLE `pegawai` ENABLE KEYS */;
    UNLOCK TABLES;

    #
    # Foreign keys for table mastergaji
    #

    ALTER TABLE `mastergaji`
    ADD CONSTRAINT `mastergaji_ibfk_1` FOREIGN KEY (`idpegawai`) REFERENCES `pegawai` (`idpegawai`);

    saya belum bisa menggunakan ARR, jadi pake query
    ———
    Alurnya begini:

    saat di panggil mastergaji, maka akan tampil grid yang menampilkan data hasil query

    public function actionIndex()
    {
    $sql=”select idMGaji, cnik, cnama, unitkerja, b.* from pegawai as a left join
    mastergaji as b on a.idpegawai = b.idpegawai;”;
    $dataProvider=new CSqlDataProvider($sql,array(
    ‘keyField’ => ‘idMGaji’,
    ));
    $this->render(‘admin’,array(
    ‘dataProvider’=>$dataProvider,
    ));
    }

    Ini sudah bisa tampil di grid, hanya gridnya tidak bisa di update/insert data yang di mastergaji.

    karena command ini :

    array(
    ‘class’=>’CButtonColumn’,
    ),

    error —> Property “CGridView.0” is not defined.

    ————————–
    Padahal saya inginnya bisa update data yang di mastergaji.
    Kan sebenarnya sudah ada yang hasil create dari CRUD, itu kan mengacu ke mastergaji.
    Jadi kalau sepengetahuan saya tinggal passing idnya ke CRUD untuk update ataupun insert. Nah caranya itu yang saya masih belum ketemu.
    —-
    Bisa kasih saran ? Atau ada cara lain yang lebih praktis?
    Saya sudah obok-obok hampir dua minggu, masih belum jebol nh. Maklum sudah berumur, lemot…
    Tks a lot

  25. kalo pake csqldataprovider emang ga bisa pake cbuttoncolumn karena beda tipenya gan.. dibuat aja CRUD nya manual dengan kasih link untuk update, view, dan delete.. coba search aja di blog ini cara menambahkan link pada cgridview gan..

  26. halo mastaaa,, itu bisa pake dua.dua nyah ? kebetulan view saya banyak pake render partial,, dan ada yang pake model, ada yang pake sql dengan left join beberapa tabel,, tapi pada saat menampilkan “_view.php” isi dr db nya tidak tempil,, mungkin ada saran ?

  27. bisa semua mbak.. mksd nya tidak tampil gimana mbak?

  28. gini,,
    misl, di view ada 2 tab ( basic dan message ) yang pake render partial,
    basic nampilin pake model ( CDetailView ), nah yang message pake sql ( CGridView ),
    disini masih belum ada masalah,,
    nah di message itu mau bisa liat detail nya, jadi saya tambahin CButtonColumn yang manggil cjuidialog,,

    dialog.php

    $sql=”
    SELECT * FROM tbl1 LEFT JOIN tbl2 ON ……. WHERE ………….

    $dataProvider=new CSqlDataProvider ($sql, array(
    ‘totalItemCount’=>$count,

    ‘db’=>Yii::app()->db,
    ‘pagination’=>array(
    ‘pageSize’=>30,
    ),
    ));

    $this->widget(‘zii.widgets.CListView’, array(
    ‘dataProvider’=>$dataProvider,
    ‘itemView’=>’_dialog’,
    ));
    ?>

    _dialog.php

    :

    :

    :

    nah pas hasil nyah ga keambil dr sql nyah,,
    saya udh check sql nyah ga ada masalah,,
    gmn yh masss nya ? mungkin ada masukkan/ saran……..
    =]

    makasii sebelum nyahhhh =D

  29. sorry..
    ini _dialog.php

    :

    :

    :

  30. wah, saya belum pernah ngalamin mbak.. yang ga tampil itu semua control nya tau dia tampil tag2 html nya tapi data nya ga ada?
    udah di cek pake firebug kalo untuk dialog nya? ada error nya ga?

  31. data nyah yang ga ke ambil,,

    :

    jadi nyah ::

    Title : ” ” –>kosong ga keambil,,

    tp udh solved skrng, saya pake cara ini ajah heheheehhh

    //Post::model()->with(‘author’)->findbyPk($id)

    $data=Notification::model()->findByAttributes(array(‘mes_id’=>$_GET[‘id’]));

    makasiii yah masstaaa =D

  32. vjrhcr says:

    gan di kasus ini nampilinnya kan di page index.php. Kalo mau tampilinnya di _form.php (inputan) gimana?udah dicoba ditampilkan di index.php berhasil,sedangkan pas dipindah ke _form.php, query buat tampilkan datanya ga muncul.

    apa pengaruh dataprovider controller yang dipasang di actionIndex(), sehingga ga bisa dipanggil di actionCreate()/_form.php

    regards

  33. iya mas, kalo mau nampilin di actionCreate/update mas juga harus buat query nya di acton tersebut..

  34. maaf saya ingin bertanya jika saya ingin menampilkan data dari database gmna?
    saya ingin menampilkan nya di index?

  35. mas tahu nampilin data di index sesuai id session barang? mohon bantuannya saya masih pemula bingung

  36. Misi mas sabit, bolehkah saya bertanya..?
    Mas, di view _form ku, itu saya pingin buat textfield 2 buah,
    1. buat textfield tampilan readonly.
    2. buat textfield isi “id” saya hidden.
    mas untuk no.1 valuenya saya ambil dr query langsung;
    $alhasil=Yii::app()->db->createCommand(“select kode, status from status where id='”.$_GET[‘id’].”‘;”)->queryScalar();
    nah $alhasil saya masukkan ke value, apakah sah2 saja mas saya bikin query lgsg di view????

  37. bisa2 aja, tapi lebih baik lewat controller/model gan..

  38. qoja says:

    mantaf…. bagus lagi klo semua action ada tutorialnya

  39. Saidatul Ulya says:

    kalau mau menampilkan data sesuai user session gimana ya mas??
    seumpama saya mau menampilkan jadwal guru sesuai nip/user guru yang sedang login, he

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: