`'MONTH'` と `'PID'` ごとに `MDAT` の合計を計算するには、Laravelのコレクションメソッドを使用して、フィルタリングされたデータを集約することができます。`groupBy` メソッドと `reduce` メソッド(または `sum` メソッド)を組み合わせて使用すると、必要な結果を得ることが可能です。
以下に、その方法を示すコード例を提供します:
```php
$models = WCOST::with([
'prj' => function ($query) {
$query->select('PID', 'DID');
},
'emp' => function ($query) {
$query->select('HID', 'DID');
}
])->select('MONTH', 'PID', 'HID', 'MDAT')
->get()
->filter(function ($wcost) {
$prjDid = optional($wcost->prj)->DID;
$empDid = optional($wcost->emp)->DID;
return $prjDid !== $empDid;
})
->map(function ($item) {
return [
'MONTH' => $item->MONTH,
'PID' => 1, // または $item->PID
'HID' => $item->HID,
'MDAT' => $item->MDAT
];
});
$aggregatedData = $models->groupBy(['MONTH', 'PID'])
->map(function ($items) {
return $items->sum('MDAT');
});
return $aggregatedData;
```
このコードでは、まず `WCOST` テーブルからデータを取得し、フィルタリングとマッピングを行います。その後、`groupBy` メソッドを使用して結果を `MONTH` と `PID` でグループ化し、`map` 内の `sum` メソッドを使って各グループの `MDAT` 値の合計を計算します。
このアプローチにより、`'MONTH'` と `'PID'` ごとに `MDAT` の合計を集約した結果を取得できます。この結果は、例えばAPIの応答としてJSON形式で返すことができます。
実際には、`$items->sum('MDAT')` を使用して `MONTH` と `PID` の値を直接取得することはできません。`sum` メソッドは数値を合計するために使われ、単一の値を返します。`MONTH` と `PID` の値を含む結果を得るためには、`map` メソッド内でそれらを明示的に含む配列を作成する必要があります。
以下のコードは、`MONTH` と `PID` ごとに `MDAT` の合計を計算し、それぞれの `MONTH` と `PID` の値も含む結果を返します:
```php
$aggregatedData = $models->groupBy(['MONTH', 'PID'])
->map(function ($items, $key) {
list($month, $pid) = explode('.', $key); // キーからMONTHとPIDを取り出す
return [
'MONTH' => $month,
'PID' => $pid,
'MDAT_SUM' => $items->sum('MDAT')
];
});
return $aggregatedData;
```
このコードでは、まず `groupBy(['MONTH', 'PID'])` でデータを `MONTH` と `PID` の組み合わせごとにグループ化します。次に、`map` メソッドを使って各グループの `MDAT` の合計を計算し、同時に `MONTH` と `PID` の値も結果に含めます。
この方法により、各 `MONTH` と `PID` の組み合わせに対する `MDAT` の合計値とともに、それぞれの `MONTH` と `PID` の値も得ることができます。これらの情報は配列として返され、必要に応じてJSON形式などで出力することが可能です。