Kali ini saya akan membahas topik yang sangat umum namun seringkali lupa (baik itu sekedar lupa bracket () maupun camelCase) yaitu melakukan retrieve data pada Yii2. Tulisan ini selain untuk berbagi juga untuk mengingatkan saya sendiri saat lagi bingung. Dan maafkan gambar di atas yang merupakan gambar Pjax, karena kurang menarik kalau tulisan ini tidak ada gambarnya. 

 

Ada banyak cara mengambil data dari database dalam Yii2. Jika dapat dikategorikan, yang pertama adalah menggunakan Active Record, dan yang kedua menggunakan command SQL secara langsung (walaupun secara substansi keduanya sama-sama menggunakan active record.

Pada cara yang pertama, kita akan benar-benar memanfaatkan model sebagai sarana mengambil data. Untuk itu configurasi model akan sangat berpengaruh dalam mengambil data. Hal yang pertama yang harus kita lakukan adalah ketika akan memanggil data menggunakan model yang telah kita buat jangan lupa untuk “use @app/models/modelName.

Active Record

Menggunakan active record berarti kita menggunakan model sebagai dasar retrieve data. Untuk itu kita menggunakan find() sebagai sarana memperoleh data. Beberapa contoh cara pengambilan data yaitu sebagai berikut.

$model = User::find(1);
if($model){
	echo $model->username;
	echo $model->status;
}
//Cara lain dengan menambahkan select untuk memilih kolom
$model = User::find()->select('column1, column2')->all();
//all digunakan untuk mengambil semua record	
$model = User::find()->all();
//sedangkan one digunakan untuk memperoleh satu record berdasarkan kondisi	
$model = User::find()->one();
//untuk menerapkan kondisi digunakan where, orWhere atau andWhere$userid=1;
$model = User::find()
	->where('userid > :userid', [':userid' => $userid])
	->one();
$model = User::find()
	->where('userid > :userid', [':userid' => $userid])
	->orWhere('primary_user = :primary_user', [':primary_user' => $primary_user])
	->andWhere('status = :status', [':status' => $status])
	->all();
//untuk mengurutkan data gunakan orderBy
$model = User::find()
    ->where(['status' => 1])
    ->orderBy('userid')
    ->all();
$model = User::find()
	->orderBy([
	       'usertype'=>SORT_ASC,
	       'username' => SORT_DESC,
		])
	->limit(10)
	->all();

//Insert Condition
$model = User::find() ->where(['status' => 0]) ->orderBy('userid') ->count(); $model = User::find() ->asArray() ->all(); //parameter menggunakan addparams() $usertype=1; $status=0; $model = User::find() ->where('usertype = :usertype and status=:status') ->addParams([':usertype' => $usertype]) ->addParams([':status' => $status]) // OR Multiple Assigns // ->addParams([':usertype' => $usertype,':status' => $status]) ->one(); //Multiple Condition dan contoh menggunakan IN $model = User::find() ->where([ 'type' => 26, 'status' => 1, 'userid' => [1001,1002,1003,1004,1005], ]) ->all(); //findBySqll cara lain menggunakan SQL dengan terikat pada attribute model $sql = 'SELECT * FROM tbl_user'; $model = User::findBySql($sql)->all();

Hal yang sering juga kita lakukan adalah membatasi pagination dan limit. Untuk hal ini contoh kode yang dapat digunakan seperti di bawah ini.

$query = Country::find();
$pagination = new Pagination([
			'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);
$countries = $query->orderBy('name')
	->offset($pagination->offset)
    ->limit($pagination->limit)
    ->all();
//Like Condition 
$model = User::find()
		->where(['LIKE', 'username', 'admin'])
		->all();
//OR
$model = User::find()
		->where('username LIKE :query') 
		->addParams([':query'=>'%admin%'])
		->all();
//IN Condition
$model = User::find()
		->where([
			'userid' => [1001,1002,1003,1004,1005],
			])
		->all();
$model = User::find()
		->select('username')
		->asArray()
		->where('userid between 1 and 5')
		->all();
$model = User::find()
		->groupBy('usertype')
		->all();

SQL Queries

Cara kedua yaitu dengan menggunakan query SQL. Kekurangan menggunakan findBySql adalah attribute / kolom tabel harus mengikuti model yang kita gunakan. Agar lebih leluasa dalam menggunakan attribut (terutama ketika ingin membuat dropdown dengan multiprimarykey) menggunakan query SQL sendiri akan lebih memberikan keleluasaan.

Use Yii/Db/Query;	
$model = $connection->createCommand('SELECT * FROM tbl_user');
$users = $model->queryAll();
$model = $connection->createCommand("SELECT * FROM tbl_user where userid=$id");
$users = $model->queryOne();	
$model = $connection->createCommand('SELECT username FROM tbl_user');
$users = $model->queryColumn();	
$model = $connection->createCommand('SELECT COUNT(*) FROM tbl_user');
$users_count = $model->queryScalar();	
$user = $connection
	->createCommand('SELECT * FROM tbl_user WHERE userid=:userid');
$user->bindValue(':userid', $_GET['userid']);
$model = $user->query();
//query class procedural style
$query = new Query;
$columns = [];
$columns[] = 'userid';
$columns[] = 'username';

$query->select($columns)
    ->from('tbl_user')
    ->limit(10);
$command = $query->createCommand();
$data = $command->queryAll();	

Baiklah itu tadi tulisan singkat mengenai retrieve data Yii2. Semoga membantu teman-teman sekalian, dan Happy Coding