【问题标题】:transform table laravel row to column based on item根据项目将表 laravel 行转换为列
【发布时间】:2020-12-21 16:43:52
【问题描述】:

嗨,请帮助我有这样的桌子:

po          date        bmi_code    qty
6800083953  2020-08-12  TA23D7GANV6 2198.27
6800083953  2020-08-12  TA40Y3LANC2 394.98
6800083953  2020-08-13  TA23D7GANV6 650.74
6800083953  2020-08-13  TA40Y3LANC2 626.52
6800083952  2020-08-14  TA23D7GANV6 424.944
6800083953  2020-08-14  TA40Y3LANC2 626.52

我想要这样的数据, 怎么做,

bmi_code    2020-08-12  2020-08-13  2020-08-14  
TA23D7GANV6 2198.27     650.74      424.944
TA40Y3LANC2 394.98      626.52      626.52

这是我的代码

$itemlist= ProductionOutput::select('bmi_code',function($query){
        $query->DB::raw('SUM(qty) as qty')->groupBy('date');
    })->groupBy('bmi_code')->get();

【问题讨论】:

    标签: php sql laravel eloquent pivot


    【解决方案1】:

    要首先对数据执行数据透视转换,您需要查询按bmi_codedate 分组的记录

    $productionResults = ProductionOutput::select('bmi_code','date',DB::raw('SUM(qty) as qty'))
        ->groupBy(['bmi_code','date'])
        ->get();
    

    $productionResults 可能会有类似的数据

    [
        ['bmi_code' => 'TA23D7GANV6', 'date' => '2020-08-12', 'qty'=> 2198.27],
        ['bmi_code' => 'TA23D7GANV6', 'date' => '2020-08-13', 'qty'=> 650.74],
        ['bmi_code' => 'TA23D7GANV6', 'date' => '2020-08-14', 'qty'=> 424.944],
        ['bmi_code' => 'TA40Y3LANC2', 'date' => '2020-08-12', 'qty'=> 394.98],
        ['bmi_code' => 'TA40Y3LANC2', 'date' => '2020-08-13', 'qty'=> 626.52],
        ['bmi_code' => 'TA40Y3LANC2', 'date' => '2020-08-14', 'qty'=> 626.52],
    
    ]
    

    在这里,我们将为每个不同的 bmi_code 值添加数组,其中将包含每个 bmi_code 类似的 bmi_code 键和日期键

    [bmi_code_value] => [[bmi_code => bmi_code_value, date1 => qty1, date2 => qty2, date3 => qty3,//....]]
    

    我们还将收集标题(不同的日期)

    $pivotData = [];
    $headers = ['BMI'];
    foreach($productionResults as $key => $productionResult){
        if( !isset($pivotData[$productionResult['bmi_code']]) ){
            $pivotData[$productionResult['bmi_code']] = array();
            $pivotData[$productionResult['bmi_code']]['bmi_code'] = $productionResult['bmi_code'];
        }
        $pivotData[$productionResult['bmi_code']][$productionResult['date']] = $productionResult['qty'];
        
        if (!in_array($productionResult['date'], $headers)) {
            $headers[] = $productionResult['date'];
        }
    }
    

    现在我们将遍历我们的数据以显示最终结果集

    echo join($headers, '  ');
    echo '<br>';
    
    foreach($pivotData as $data){
      foreach($headers as $header){
       echo $data[$header]. '  ';
      }
      echo '<br>';
    }
    

    输出

    BMI         2020-08-12 2020-08-13 2020-08-14
    TA23D7GANV6 2198.27    650.74     424.944
    TA40Y3LANC2 394.98     626.52     626.52
    

    【讨论】:

    • 嗨,谢谢它的工作,但是如果我只想要没有标题的值,该怎么办
    • @FahrulRizal 如果您不需要$headers,请跳过echo join($headers, ' '); 这部分,但要显示最终集合中的值仍然需要$headers 数组
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2018-03-29
    相关资源
    最近更新 更多