Pada tulisan ini saya akan membuat series mengenai pemrograman dengan Yii Framework. Series ini akan disusun untuk membuat sebuah program sederhana yang memanfaatkan fitur-fitur umum yang sangat mungkin digunakan di banyak kasus. Tulisan ini akan menggunakan Basic Template Yii2 (yang menurut saya penggunaannya sedikit lebih sulit daripada advance template Yii2).

Secara garis besar (dan mungkin akan bertambah sesuai keperluan yang mungkin terjadi) outline dari seri tulisan ini akan terdiri dari hal berikut.

  1. Prainstalasi
  2. Instalasi YiiFramework 2.0
  3. Login
  4. Login dengan Database pada Yii2
  5. Bekerja dengan Gii
  6. Module pada Yii2
  7. Layout dasar dan Manipulasinya pada Yii2
  8. Costum Asset dan Asset Bundle pada Yii2
  9. Alias pada Yii2
  10. Bekerja dengan Form
  11. Timestamp, Blameable, dan Sluggable Behavior pada Yii2
  12. Menggunakan Rich Text Input CkEditor dan Alternatifnya pada Yii2
  13. Gridview dan Listview
  14. SEO Friendly Url dengan slug
  15. Scenario pada Model Yii2
  16. Retrieve data pada Yii2
  17. Relasi Database pada Yii2
  18. Widget Kartik
  19. Select2 dengan Kartik Ekstension
  20. Dependent Dropdown pada Yii2
  21. Bekerja dengan Modals
  22. Membuat Costum Template untuk Gii
  23. Mengupload File
  24. Mengupload File dengan Kartik Widget
  25. Gridview atau Datatables?
  26. Session dan Cookie pada Yii2
  27. Menggunakan AdminLTE pada Yii2
  28. Membuat Themes pada Yii2
  29. Menggunakan GoogleMaps API pada Yii2
  30. Menggunakan Socket.io pada Yii2
  31. Handling Error
  32. Bekerja dengan AuthClient
  33. Menggunakan Amazon S3 pada Yii2
  34. Mengirim Email dengan Swiftmailer pada Yii2
  35. Middleware pada Yii2
  36. Mengenal RBAC pada Yii2
  37. Implementasi RBAC pada Yii2
  38. Notifikasi Real Time dengan Socket.io pada Yii2

Anda dapat mengunduh dan memantau progress dari series ini lewat repositori Github belajararief-yii2series. Silahkan bintangi (star) untuk dapat lebih mudah memantau perkembangan repositori.

Requirement

Untuk memudahkan anda dalam memahami petunjuk ini, maka beberapa hal yang perlu diperhatikan diantaranya:

  1. Sistem Operasi yang saya gunakan adalah Windows 10 64bit dengan terminal menggunakan powershell terminal (beberapa command seperti cd dapat berbeda dengan command prompt biasa), namun saya akan berusaha sebisa mungkin mencontohkan perintah pada sistem operasi lain jika memunkinkan.
  2. Stack yang digunakan adalah Wamp Server (Apache 2.2, MySQL, PHP 7).
  3. Yii yang digunakan adalah Yii 2.0 dengan catatan jquery yang digunakan bukan jquery3. Beberapa perintah jquery akan berbeda pada jquery3, dan beberapa extensions yang saya gunakan sepertinya belum mendukung jquery3

Abstraction Layer pada Model

Retrieve data pada Yii2 pada praktik umumnya adalah menggunakan Active Record. Cara ini lebih direkomendasikan karena memberikan manfaat penggunaan DAO semaksimal mungkin. Dengan penggunaan Active Record maka memberikan fleksibilitas dalam aplikasi kita seperti scale-up database, dengan mudah berganti jenis database (contohnya dari MySQL ke SQLServer atau bahkan menggunakan NoSQL), dan ketika kita melakukan updating database. Namun terkadang kita membutuhkan cara lain dalam melakukan retrieve data yaitu dengan menggunakan SQL Query secara langsung. Kedua cara tersebut dapat digunakan di Yii2.

Secara sederhana ActiveRecord yang menjadi kunci bagi hubungan database dan aplikasi terdiri dari 3 layers abstraction. Layer pertama yaitu DAO, kemudian Query Builder, dan terakhir yaitu Active Record yang kita gunakan. Gambaran dari 3 lapisan tersebut dalam Yii2 Active Record seperti di bawah ini.

Model memanfaatkan Active Record untuk berkomunikasi dengan Database. Active Record sendiri sebenarnya merupakan extends dari Model Base yii2. Ketika kita membuat sebuah model, model bekerja layaknya sebuah Active Record. Kemudian ketika kita menjalankan metode find() maka Active Record akan membuat query untuk meretrieve data menggunakan yang pada Yii2 disebut Active Query. Gambaran hubungan antara Model dan penggunaan metode find() dapat dilihat seperti di bawah ini.

Lebih lengkap menegenai Database Abstraction Layers pada Yii2 dapat anda lihat pada presentasi Carsten Brandt (cebe) yang merupakan Yii Core Developer Team pada link berikut (https://www.cebe.cc/en/consulting/yii-framework-training) video - slide.

 

Retrieve Data dengan Active Record

Menggunakan Active Record berati kita menggunakan model sebagai dasar retrieve data. Untuk itu kita menggunakan metode find() yang ada pada Model. Strutur retrieve data dengan find secara singkat seperti di bawah ini. Anda dapat menggunakan repositori ini sebagai contoh mempelajari retrieve data.

use app\models\Blog;
// ......
Blog::find()->one(); // dengan metode one, Model hanya akan memberikan satu record saja
Blog::find()->all(); // dengan perintah all(), model akan memberikan semua record yang ada

Perintah tersebut akan meretrieve semua kolom yang ada (*) pada tabel. Apabila kita hanya akan menyeleksi kolom tertentu saja maka perintahnya menjadi seperti ini.

use app\models\Blog;
// ......
Blog::find()->select('title', 'content')->one(); // dengan metode one, Model hanya akan memberikan satu record saja
Blog::find()->select('title', 'content')->all(); // dengan perintah all(), model akan memberikan semua record yang ada

Pada banyak kasus data yang kita retrieve dapat memiliki kriteria tertentu. Sebagai contoh kita hanya akan mengambil data dengan user id tertentu.

use app\models\Blog;
// ......
Blog::find()->where(['id' => 2])->one();
Blog::findOne(['id' => 2]); // kode ini akan memberi hasil yang sama seperti kode di atas

Blog::find()->where(['id' => 2])->all();
Blog::findAll(['id' => 2]); // kode ini akan memberi hasil yang sama seperti kode di atas

Apabila anda memerlukan tambahan kriteria data namun diambil secara dinamis maka anda dapat menggunakan metode andWhere() seperti di bawah ini.

use app\models\Blog;
// ......
$model = Blog::find()->where(['id' => 2]);
if(!Yii::$app->isGuest) $model = $model->andWhere(['created_by' => Yii::$app->user->identity->id]); // maka hanya data dengan id 2 dan dengan user yang sedang login saja yang akan diretrieve
$model = $model->one()

Selanjutnya kita akan memanggil sebuah kolom pada view. Hal itu dilakukan seperti ini.

use app\models\Blog;
// ......
$model = Blog::find()->where(['id' => 2]);
if(!Yii::$app->isGuest) $model = $model->andWhere(['created_by' => Yii::$app->user->identity->id]);
$model = $model->one()
// ......
// memanggil pada view
echo $model->title;
echo $model->content;

Lebih lanjut mengenai contoh-contoh kasus lainnya mengenai retrieve data dapat anda peroleh pada tulisan "Retrieve Data Yii2".

Retrieve Data dengan SQL Query

Namun pada beberapa kasus kita ingin membuat SQL Query sendiri yang lebih mudah dan cepat menurut persepsi kita. Kita dapat langsung menggunakan SQL Query dengan createCommand() pada Yii2. Hal ini terkadang dilakukan untuk query yang sangat kompleks dan membutuhkan optimasi yang lebih agar dapat memperoleh data dengan lebih mudah dan cepat. Namun salah satu hal yang harus dikorbankan adalah dengan direct SQL Query fleksibilitas database menjadi banyak berkurang dibandingkan dengan Model.

Kita akan coba membuat contoh dengan query yang sama seperti contoh sebelumnya.

Blog::find()->where(['id' => 2, id => Yii::$app->user->identity->id])->one();  
Yii::$app->db->createCommand("select * from blog where id = :id AND user_id = :userId")->bindValues([':id' => 2, ':userId' => Yii::$app->user->identity->id])->queryOne() // kode ini akan memberi hasil yang sama seperti kode di atas

Blog::find()->where(['id' => 2])->all();
Yii::$app->db->createCommand("select * from blog where id = :id")->bindValues(['id' => 2])->queryAll(); // kode ini akan memberi hasil yang sama seperti kode di atas

Pada contoh di atas kita menggunakan bindValues() seperti pada saat kita membuat query menggunakan PDO yang memanfaatkan prepared statement. Pada saat kita menggunakan createCommand, metode diakhiri dengan queryOne() atau queryAll() yang merupakan padanan dari one() dan all() pada Active Record. Setelah terbiasa ini akan menjadi sangat mudah digunakan. Lebih lanjut mengenai contoh-contoh kasus lainnya mengenai retrieve data dapat anda peroleh pada tulisan "Retrieve Data Yii2".


Demikian semoga bermanfaat dan Happy Coding!