php - 如何在 laravel eloquent 控制器上正确应用 foreach 以进行表格转置
问题描述
我想创建显示转置表的控制器,其中行转换为列。
参考代码:
SELECT
hostid
,sum(case when itemname = (select distinct itemname from history a order by 1 limit 0,1) then itemvalue end) as A
,sum(case when itemname = (select distinct itemname from history a order by 1 limit 1,1) then itemvalue end) as B
,sum(case when itemname = (select distinct itemname from history a order by 1 limit 2,1) then itemvalue end) as C
FROM history group by hostid order by 1;
+--------+------+------+------+
| hostid | A | B | C |
+--------+------+------+------+
| 1 | 10 | 3 | NULL |
| 2 | 9 | NULL | 40 |
+--------+------+------+------+
我的查询是控制器目标:
select
nilai_t1.nim,
pendaftar.nama,
sum(case when nilai_t1.id_sk1 = 11 then nilai_t1.nilai else 0 end) as 'Tanggung Jawab',
sum(case when nilai_t1.id_sk1 = 12 then nilai_t1.nilai else 0 end) as 'Keaktifan',
sum(case when nilai_t1.id_sk1 = 13 then nilai_t1.nilai else 0 end) as 'Teamwork',
sum(case when nilai_t1.id_sk1 = 21 then nilai_t1.nilai else 0 end) as 'Wawancara',
sum(case when nilai_t1.id_sk1 = 31 then nilai_t1.nilai else 0 end) as 'Tes Bakat'
from nilai_t1
inner join sub_kriteria_t1
on nilai_t1.id_sk1 = sub_kriteria_t1.id_sk1
inner join kriteria_t1
on sub_kriteria_t1.id_k1 = kriteria_t1.id_k1
inner join peserta_t1
on nilai_t1.nim = peserta_t1.nim
inner join pendaftar
on peserta_t1.nim = pendaftar.nim
group by nilai_t1.nim;
Before:
+----+------------+--------+-------+
| id | nim | id_sk1 | nilai |
+----+------------+--------+-------+
| 1 | 181011**** | 11 | 30 |
| 2 | 181011**** | 12 | 30 |
| 3 | 181011**** | 13 | 25 |
| 4 | 181011**** | 21 | 72 |
| 5 | 181011**** | 31 | 57 |
| 6 | 181052**** | 11 | 20 |
| 7 | 181052**** | 12 | 20 |
| 8 | 181052**** | 13 | 10 |
| 9 | 181052**** | 21 | 75 |
| 10 | 181052**** | 31 | 57 |
+----+------------+--------+-------+
After:
+------------+------------------------+----+----+----+----+----+
| nim | nama | 11 | 12 | 13 | 21 | 31 |
+------------+------------------------+----+----+----+----+----+
| 181011**** | Annisa indra | 30 | 30 | 25 | 72 | 57 |
| 181052**** | Muhammad fakhri naufal | 20 | 20 | 10 | 75 | 57 |
+------------+------------------------+----+----+----+----+----+
这是我的控制器代码之一:
public function calculate(){
$sk_pluck = $sk = SubKriteriaTahap1::
join('kriteria_t1', 'sub_kriteria_t1.id_k1', '=', 'kriteria_t1.id_k1')
->pluck(
'sub_kriteria_t1.id_sk1');
$sk_pluck->all();
//$kriteria = KriteriaTahap1::all();
$transpose=[];
foreach ($sk_pluck as $sk1){
$transpose = 'sum(case when nilai_t1.id_sk1 =' .$sk1.' then nilai_t1.nilai else 0 end) AS \'Table\'';
}
$trans_array = array($transpose);
$penilaian1 = PenilaianTahap1::select('nilai_t1.nim',
'pendaftar.nama', DB::raw(implode(',', $trans_array)))
->join('peserta_t1', 'nilai_t1.nim', '=', 'peserta_t1.nim')
->join('pendaftar', 'peserta_t1.nim', '=', 'pendaftar.nim')
->join('sub_kriteria_t1', 'nilai_t1.id_sk1', '=', 'sub_kriteria_t1.id_sk1')
->join('kriteria_t1', 'sub_kriteria_t1.id_k1', '=', 'kriteria_t1.id_k1')
->groupBy('nilai_t1.nim')
->get([
'nilai_t1.nim',
'nilai_t1.nilai',
'nilai_t1.id_sk1'
]);
$response = [
'message' => 'id',
'data' => $trans_array
];
return response()->json($response, Response::HTTP_OK);
}
但问题是,foreach 循环不起作用。它只显示一个标准而不是许多可用的标准。这是基于 REST API 的当前结果:
{"message":"id","data":["sum(case when nilai_t1.id_sk1 =31 then nilai_t1.nilai else 0 end) AS 'Table'"]}
但是$sk_pluck
确实显示了许多可用的标准 ID:
{"message":"id","data":[11,12,13,21,31]}
因为这些问题,控制器只产生具有单一标准的查询:
{"message":"id","data":[{"nim":1810112048,"nama":"Annisa indra","Table":57},{"nim":1810522038,"nama":"Muhammad fakhri naufal","Table":57}]}
那么如何在我的控制器上正确使用 foreach 以便SUM
表转置(将行转换为列)的查询有效?或者有什么解决办法?
解决方案
推荐阅读
- python - 将整个数组与来自另一个数组的条目独立地相乘
- javascript - 在游戏中静音和取消静音的问题
- spring-boot - 如何使用文件URI从运行springboot的docker镜像访问本地文件?
- python-3.x - Python - 打开文件并在屏幕上显示
- c# - 如何以不同的速度编写一堆第一人称动画
- material-ui - KeyboardDatePicker 的 Material UI 填充输入
- r - (R) 编辑数据表中多列数据后面单元格的渐变颜色
- angular - ngFor 中调用的方法多次触发
- azure-devops - 获取项目列表及其进程名称
- rest - 如何使用rest api从nuxeo文件夹中获取文件名列表?