【发布时间】:2021-10-06 17:07:24
【问题描述】:
我的 dtaabse 中有表“transaction_items”,看起来与此类似...
| id | transaction_id | qty | unit_price |
|---|---|---|---|
| 1 | 100 | 1 | 10.00 |
| 1 | 100 | 2 | 10.00 |
| 1 | 100 | 3 | 10.00 |
| 1 | 200 | 1 | 20.00 |
| 1 | 200 | 1 | 20.00 |
| 1 | 300 | 1 | 15.00 |
当前我获取数据:
$data['transaction_items'] = DB::table('transaction_items')->get();
并运行一个 foreach 循环:
foreach ($transaction_items as $trans) {
<tr>
<td> {{ $trans->transaction_id}} </td>
<td> {{ $trans->qty}} </td>
<td> {{ $trans->unit_price}} </td>
<td> * WHOLE TRANSACTION TOTAL</td>
这会像您期望的那样完美地输出数据。虽然我输出的最后一个值 (*WHOLE TRANSACTION TOTAL) 正在运行另一个查询和 foreach 循环以获取整个事务的“总数”。
<tr>
<td>
<?php
$totals = DB::table('transaction_items')->select('qty', 'unit_price')->where('transaction_id', '=', $trans->transaction_id)->get();
$ftot = 0;
foreach ($totals as $total) {
$ftot += $total->qty * $total->unit_price;
}
echo '£'.number_format($ftot, 2);
?>
</td>
</tr>
我知道这可能是错误的做法,但这就是我的原因。
我当前的输出看起来像这样......
| transaction_id | qty | unit_price | Trans Total |
|---|---|---|---|
| 100 | 1 | 10.00 | 60.00 |
| 100 | 2 | 10.00 | 60.00 |
| 100 | 3 | 10.00 | 60.00 |
| 200 | 1 | 20.00 | 40.00 |
| 200 | 1 | 20.00 | 40.00 |
| 300 | 1 | 15.00 | 15.00 |
我希望它看起来像这样,它显示具有相同 transaction_id 的最后一行之后的总数。
| transaction_id | qty | unit_price | Trans Total |
|---|---|---|---|
| 100 | 1 | 10.00 | |
| 100 | 2 | 10.00 | |
| 100 | 3 | 10.00 | 60.00 |
| 200 | 1 | 20.00 | |
| 200 | 1 | 20.00 | 40.00 |
| 300 | 1 | 15.00 | 15.00 |
希望这是有道理的,并提前感谢。
额外编辑
我曾尝试使用“减少”方法,但得到...
$totals = DB::table('transaction_items')
->select('qty', 'unit_price')
->where('transaction_id', '=', $trans->transaction_id)
->get()
->groupBy('transaction_id')->each(function($item) {
$sum = $item->reduce(fn($carry, $product) => $carry + ($product['qty'] * $product['unit_price']));
$lastRow = $item->pop();
$lastRow['sum'] = $sum;
$item->push($lastRow);
return $item;
})->flatten(1);
$ftot = 0;
foreach ($totals as $total) {
$ftot += $total->qty * $total->unit_price;
}
echo '£'.number_format($ftot, 2);
但我收到此错误:
Cannot use object of type stdClass as array
如果我在 original $totals 上执行“print_r”,这是其中一行的示例..
Illuminate\Support\Collection Object (
[items:protected] => Array (
[0] => stdClass Object (
[transaction_id] => 20940
[qty] => 4.00
[unit_price] => 80.0000
)
[1] => stdClass Object (
[transaction_id] => 20940
[qty] => 6.00
[unit_price] => 10.0000
)
[2] => stdClass Object (
[transaction_id] => 20940
[qty] => 308.00
[unit_price] => 0.4000
)
[3] => stdClass Object (
[transaction_id] => 20940
[qty] => 308.00
[unit_price] => 0.0500
)
[4] => stdClass Object (
[transaction_id] => 20940
[qty] => 1.00
[unit_price] => 10.3000
)
)
)
【问题讨论】: