Belajar Menggunakan GROUP dan COUNT di CodeIgniter

- September 07, 2018
Ceritanya begini, penulis mau menghitung total asset berdasarkan masing-masing kategori pada suatu tabel, menggunakan Codeigniter. Namun karena saya masih awam pada MySQL, makanya penulis membuat fungsi loop untuk mengambil ID menggunakan statement WHERE lalu menghitung jumlah rownya, nah itu sudah totalnya.



Bingung kan? Iya, penulis juga bingung. Biar sama-sama bingung, penulis tampilkan ketiga tabel sebagai berikut:


Sedikit penjelasan biar tambah bingung,
  • tb_asset : adalah tabel yang menampung semua informasi aset seperti id, nama aset itu sendiri dan model. Pada field model, hanya menampung id dari model yang akan diambil dari tb_model
  • tb_model : adalah tabel yang menampung informasi model aset, seperti misalnya Syncmaster 633NW (untuk aset lcd monitor), atau L200 (untuk printer) dan seterusnya. tb_model ini menyimpan informasi kategori (yang hanya berupa ID) yang mengacu pada tabel tb_kategori 
  • tb_kategori : adalah tabel kategori aset yang bersifat lebih umum lagi, seperti Personal Computer, Printer, Router
Sampai sini mudah-mudahan sudah bertambah bingung. Nah, tujuan penulis adalah untuk merekap semua aset berdarkan kategori. Misalnya, untuk Inkjet printer, totalnya ada berapa. Inkjet Printer sendiri modelnya ada banyak, ada L100, L200, IP1980 dan sebagainya (tb_model), dan total yang menggunakan aset ini ada pada tabel tb_asset.

Looping Dimulai

Karena keterbatasan pengetahuan penulis, olehnya itu penulis membuat fungsi-fungsi pada Model, seperti fungsi hitungDataAssetbyModel() untuk mencari tahu berapa jumlah asset yang ada berdasarkan id_model
function hitungDataAssetbyModel($id_model)
{
 $this->db->select('tb_asset.model');
 $this->db->where('model',$id_model);
 $query = $this->db->get('tb_asset');
 if($query->num_rows()>0)
 {
  return $query->num_rows();
 }
}
Selanjutnya membuat fungsi hitungDataModelbyKategori(), untuk mencari tahu berapa jumlah kategori yang digunakan pada tabel model
function hitungDataModelbyKategori($id_kategori)
{
 $this->db->select('tb_model.id');
 $this->db->where('kategori',$id_kategori);
 $query = $this->db->get('tb_model');
 if($query->num_rows()>0)  
 {      
 return $query->result();
 }
} 
Kemudian fungsi terakhir adalah untuk menghitung berapa kategori yang terpakai pada tabel kategori berdasarkan tipe nya.
function hitungDataKategoribyTipe($id_tipe)
{
  $this->db->select('tb_kategori.id, tb_kategori.kategori');
  $this->db->where('tipe',$id_tipe);
  $this->db->order_by('kategori','asc');
  $query = $this->db->get('tb_kategori');
  if($query->num_rows()>0)
  {
    return $query->result();
  }
}
Kemudian pada Controller, penulis memanggil fungsi-fungsi yang tadi, dalam bentuk looping, sebagai berikut ini, tipe = '1' itu adalah tipe untuk aset.
$tipe = $this->m->hitungDataKategoribyTipe('1');    
    if($tipe)
    {
      foreach($tipe as $t)
      {
        $tot=0;
        $kat = $this->m->hitungDataModelbyKategori($t->id);
        if($kat){
          foreach($kat as $k)
          {
            $mod = $this->m-> hitungDataAssetbyModel($k->id);
            if($mod)
            {
              $tot=$mod+$tot;  
            }
          }
        }
        $field = array (      
           'zkategori' =>$t->kategori,
           'ztot' => $tot
        );      
      }      
    }
    $data['d_total_asset'] = $field;   
Pada baris :
$field = array (       
     'zkategori' =>$t->kategori,
     'ztot' => $tot
    ); 
Berfungsi untuk menyimpan data hasil loopingan tadi, berharap akan terisi dengan dua data yang berbentuk array, yakni data kategori dan total.

Selanjutnya pada View, penulis menampilkan data yang dipassing oleh Controller tadi.
<?php
if($d_total_asset)
{
 foreach ($d_total_asset as $d) 
{ ?>
 <tr>
 <td><?php echo $d->zkategori ?></td>
 <td><?php echo $d->ztot ?></td>
 <td>0</td>
 <td>0</td>
 <td>0</td>
 </tr>
<?php
}
}
?> 
Save, dan refresh di browser. Hasilnya adalah, seperti yang diharapkan, ERROR !!!! hahahaha.


Kayaknya pernah lihat pesan error seperti ini, katanya penulis mau mengambil property dari sesuatu yang bukan object. Yahh, bener juga sih, secara data tadi itu hanya berbentuk arary.


Untuk lebih memastikan, penulis 'mencetak' data tersebut biar kelihatan gitu gimana sih penampakannya pake fungsi print_r(). Hasilnya adalah


Seingat penulis, harusnya tidak begitu, ada stdClass Object apaa gitu, dan herannya lagi, kok cuma sebaris data saja yang masuk? hanya baris terakhir saja dari tabel, berarti data-data yang pertama tertimpa dong, jadi yang ada adalah data yang masuk terakhir. Berarti fix, tipe data field yang penulis gunakan SALAH !!!.  Keliling-keliling sama mbah Google, cari sesuatu, dapatnya fungsi untuk merubah Array menjadi Object, wahh, tambah repot lagi nih. Ahh tinggalkan dulu, coba-coba ubah langsung, biasalah, karena kurang nya ilmu dan malas membaca. Akhirnya variabel field saya rubah menjadi seperti :


Tetap error sih, namun outputnya sudah menampung banyak data, menjadi


Nahh, melihat seperti ini sudah mirip-mirip dengan output jika penulis ingin mengecek data hasil query. Cuma bedanya ada tulisan array di dalam array, yang seharusnya sih stdClass Object apaa gitu. Coba lagi mengubah variabel $field menjadi seperti berikut, berharap datanya berubah menjadi Object

Hasilnya tanpa dididuga, sudah ada tulisan stdClass Object, namun datanya masih satu.


Timbul-lah ide gila menggabungkan kedua 'percobaan bodoh' tadi sehingga variabel $field menjadi


Setelah dicoba, berhasil dan no error lagi :D


Berikut penampakan tabel total aset berdasarkan kategori


Alhamdulillah, akhirnya selesai juga. Selesai? Belum, sehari sesudahnya penulis masih penasaran, masa iya harus serumit itu menggabungkan 3 tabel, kalau join sih bisa, tetapi untuk hitung datanya bagaimana? Mungkin bisa, tetapi waktu itu penulis lagi malas cari solusinya, akhirnya diakali dengan membuat fungsi looping untuk menghitung data-data tersebut. Apakah ini memberatkan di sisi server? Apakah ini tidak efisien? Sudah tentu.

Penulis pun mencari informasi tambahan mengenai olah data MySQL, ketemulah GROUP BY dan COUNT, bisa juga menggunakan HAVING ternyata.

Okelah, dicoba dulu di inline-syntax SQL phpMyAdmin, didapatlah query untuk menghasilkan data yang penulis inginkan.


QUERY nya seperti berikut
SELECT  tb_kategori.kategori, COUNT(tb_kategori.kategori) as total
FROM `tb_asset`
JOIN tb_model ON tb_asset.model = tb_model.id
JOIN tb_kategori ON tb_model.kategori = tb_kategori.id
GROUP BY kategori 
Apahhh?? Segampang itu kah? Sia-sib dong fungsi  dan looping yang dibuat kemarin? Yaa gitu deh.

Langkah Terakhir

Akhirnya penulis menghapus fungsi looping tersebut, dan membuat fungsi baru lagi di Model, hitungDataAssetTiapKategori() :
function hitungDataAssetTiapKategori()
{  
 $this->db->select('tb_kategori.kategori, count(tb_kategori.kategori) as total'); 
 $this->db->join('tb_model','tb_asset.model = tb_model.id');
 $this->db->join('tb_kategori', 'tb_model.kategori = tb_kategori.id'); 
 $this->db->group_by('kategori');
 $query = $this->db->get('tb_asset');
 if($query->num_rows()>0)
 {
 return $query->result();
 }
}
di controller menjadi
$data['d_total_asset'] = $this->m->hitungDataAssetTiapKategori();
di view menjadi
<?php
if($d_total_asset)
{
 foreach ($d_total_asset as $d) 
{ 
?>
<tr>
<td><?php echo $d->kategori ?></td>
<td><?php echo $d->total ?></td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<?php
}
}
?>
Capek juga ternyata, buat postingan ini termasuk di dalamnya. Dikarenakan karena penulis kurang ilmu dan malas membaca.



Okelah, semoga postingan Belajar Menggunakan Group dan Count di Codeigniter ini bisa menjadi pelajaran buat penulis dan juga sebagai catatan, dan moga-moga bermanfaat bagi pembaca.

Terima kasih (z)

7 komentar:

  1. gan boleh dibagi source kode nya?

    BalasHapus
  2. gan buat log aktifitas itu gimana ya boleh bagi ilmunya?

    BalasHapus
    Balasan
    1. dibuatin helper log, nanti dipanggil saat sukses query nya..

      Hapus
    2. btw, sekalian dibuatin deh tutorialnya, silahkan cek https://blog.zdienos.com/2019/04/belajar-membuat-helper-log-aktivitas-dengan-codeigniter.html

      Hapus
  3. kak $d->total itu kan dari aliasnya kan. nah pada saat aku panggil aliasnya kok undefinednya
    ini querynya
    select id_kota,
    sum(if(id_kriteria = 1,nilai,0)) as CA1,
    sum(if(id_kriteria = 2,nilai,0)) as CA2,
    sum(if(id_kriteria = 3,nilai,0)) as CA3,
    sum(if(id_kriteria = 4,nilai,0)) as CA4,
    sum(if(id_kriteria = 5,nilai,0)) as CA5,
    sum(nilai) as jumlah from tb_proses_spk
    group by id_kota

    jadi dalam viewnya saat $d->CA1, $d->CA2,$d->CA3 nah kenapa undefined ya

    BalasHapus
    Balasan
    1. biasanya karena belum terbentuk variabelnya

      Hapus


EmoticonEmoticon

 

Start typing and press Enter to search