LaravelPHP

LOOPING DATA DI SQL DAN ARRAY COLLECTION LARAVEL

Selamat pagi para pembaca dan calon programer handal, kali ini saya akan berbagi lagi tips mudah mengolah data di php menggunakan looping data agar code pemrograman tidak gemuk, masalah seperti ini akan sering kita jumpai jika mengerjakan project-project dari peruhaan yang tiap hari ada ribuan transaksi, jika kita tidak menggunakan query looping maka code yang ditulis akan banyak, dan tentu untuk maintenance pasti akan susah. Sebagai contoh code dibawah ini :

$data_unit = DB::select("SELECT kodeunit FROM units WHERE aktif='Y' ORDER BY kodeunit ASC");

$arrSql = array();
            foreach($data_unit as $data){
                array_push($arrSql,
                    "SUM(CASE WHEN unit = '$data->kodeunit' THEN qty ELSE 0 END)/100 AS bmg_$data->kodeunit, (SUM(CASE WHEN unit = '$data->kodeunit' THEN value_total_transaksi ELSE 0 END)/100)/(SUM(CASE WHEN unit = '$data->kodeunit' THEN qty ELSE 0 END)/100) AS hrg_$data->kodeunit,",
                );
            }
            $sqlArray = implode(" ",$arrSql);

            $sqlMguUnit = DB::select("SELECT CAST(RIGHT(YEARWEEK(tanggal,1),2) AS UNSIGNED) AS minggu,
                                            DATE_ADD(tanggal, INTERVAL(1-DAYOFWEEK(tanggal)+1) DAY) AS tglawal,
                                            DATE_ADD(tanggal, INTERVAL(7-DAYOFWEEK(tanggal)+1) DAY) AS tglakhir,
                                            SUM(qty)/100 AS ytdbox,
                                            (SUM(value_total_transaksi)/100)/(SUM(qty)/100) AS ytdharga, $sqlArray id
                                        FROM table_sclog_rekap_pembelian_doc $strWhere
                                        GROUP BY CAST(RIGHT(YEARWEEK(tanggal,1),2) AS UNSIGNED) ORDER BY YEARWEEK(tanggal,1) ASC");
           
            $data_doc_perminggu_unit = collect(array_map(function($item) use ($tahun, $data_unit, $ap, $sqlMguUnit){
                            $a = [
                                'minggu' => $item->minggu,
                                'tglawal' => $item->tglawal,
                                'tglakhir' => $item->tglakhir,

                                'ytdbox' => $item->ytdbox,
                                'ytdfluk' => fluk_doc_unit_all_ext($sqlMguUnit, $item->ytdbox, 'ytdbox', $tahun, $ap),
                                'ytdrataan' => abs(100 - fluk_doc_unit_all_ext($sqlMguUnit, $item->ytdbox, 'ytdbox', $tahun, $ap)),
                                'ytdharga' => $item->ytdharga,
                            ];

                            foreach($data_unit as $data){
                                $kdunit = $data->kodeunit;
                                $bmgUnit = 'bmg_'.$kdunit;
                                $flukUnit = 'fluk_'.$kdunit;
                                $rataanUnit = 'rataan_'.$kdunit;
                                $hrgUnit = 'hrg_'.$kdunit;

                                $a[$bmgUnit] = $item->$bmgUnit;
                                $a[$flukUnit] = fluk_doc_unit_bm($item->$bmgUnit, $kdunit);
                                $a[$rataanUnit] = abs(100 - fluk_doc_unit_bm($item->$bmgUnit, $kdunit));
                                $a[$hrgUnit] = $item->$hrgUnit;
                            }
                            return $a;
                        },$sqlMguUnit));

Diatas adalah kode lengkap menggunakan looping didalan query sql, untuk penjelasan kode potongannya seperti dibawah ini :

1. Mengambil data unit

$data_unit = DB::select("SELECT kodeunit FROM units WHERE aktif='Y' ORDER BY kodeunit ASC");

2. Menerapkan looping kode unit di query sql dengan variable string

$arrSql = array();
            foreach($data_unit as $data){
                array_push($arrSql,
                    "SUM(CASE WHEN unit = '$data->kodeunit' THEN qty ELSE 0 END)/100 AS bmg_$data->kodeunit, (SUM(CASE WHEN unit = '$data->kodeunit' THEN value_total_transaksi ELSE 0 END)/100)/(SUM(CASE WHEN unit = '$data->kodeunit' THEN qty ELSE 0 END)/100) AS hrg_$data->kodeunit,",
                );
            }
            $sqlArray = implode(" ",$arrSql);

3. Menggabungkan dalam satu queri sql

$sqlMguUnit = DB::select("SELECT CAST(RIGHT(YEARWEEK(tanggal,1),2) AS UNSIGNED) AS minggu,
                                            DATE_ADD(tanggal, INTERVAL(1-DAYOFWEEK(tanggal)+1) DAY) AS tglawal,
                                            DATE_ADD(tanggal, INTERVAL(7-DAYOFWEEK(tanggal)+1) DAY) AS tglakhir,
                                            SUM(qty)/100 AS ytdbox,
                                            (SUM(value_total_transaksi)/100)/(SUM(qty)/100) AS ytdharga, $sqlArray id
                                        FROM table_sclog_rekap_pembelian_doc $strWhere
                                        GROUP BY CAST(RIGHT(YEARWEEK(tanggal,1),2) AS UNSIGNED) ORDER BY YEARWEEK(tanggal,1) ASC");

4. Koneversi data ke array map dan collect agar data bisa di jumlahkan atau mencari rata-rata per kolom

$data_doc_perminggu_unit = collect(array_map(function($item) use ($tahun, $data_unit, $ap, $sqlMguUnit){
                            $a = [
                                'minggu' => $item->minggu,
                                'tglawal' => $item->tglawal,
                                'tglakhir' => $item->tglakhir,

                                'ytdbox' => $item->ytdbox,
                                'ytdfluk' => fluk_doc_unit_all_ext($sqlMguUnit, $item->ytdbox, 'ytdbox', $tahun, $ap),
                                'ytdrataan' => abs(100 - fluk_doc_unit_all_ext($sqlMguUnit, $item->ytdbox, 'ytdbox', $tahun, $ap)),
                                'ytdharga' => $item->ytdharga,
                            ];

                            foreach($data_unit as $data){
                                $kdunit = $data->kodeunit;
                                $bmgUnit = 'bmg_'.$kdunit;
                                $flukUnit = 'fluk_'.$kdunit;
                                $rataanUnit = 'rataan_'.$kdunit;
                                $hrgUnit = 'hrg_'.$kdunit;

                                $a[$bmgUnit] = $item->$bmgUnit;
                                $a[$flukUnit] = fluk_doc_unit_bm($item->$bmgUnit, $kdunit);
                                $a[$rataanUnit] = abs(100 - fluk_doc_unit_bm($item->$bmgUnit, $kdunit));
                                $a[$hrgUnit] = $item->$hrgUnit;
                            }
                            return $a;
                        },$sqlMguUnit));

Selesai, output data yang didapat berupa array collection, dimana kita bisa menjumlah atau mencari rata-rata menggunakan fungsi dibawah ini :

$data_doc_perminggu_unit ->avg('hrg_ytd')
$data_doc_perminggu_unit ->sum('hrg_ytd')
$data_doc_perminggu_unit ->count('hrg_ytd')

Sekian artikel dari saya, semua artikel yang saya tulis adalah permasalahan yang pernah saya alami dan penyelesaiannya, semoga bisa membantu teman-teman dalam penyelesaian masalah dalam code pemrogaram.

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button