为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Laravel eloquent/collections 计算 PHP 中相似键的总量

如何使用 Laravel eloquent/collections 计算 PHP 中相似键的总量

PHP
慕森王 2021-11-26 19:13:46
我目前有 API 返回的以下 json 响应。我可以使用 Laravel Eloquent 返回它。有多个用户,每个用户都有几张收据。收据具有类型和状态。我想尝试获取与其类型和状态相关的每张收据的总金额。我能够使用返回以下 json 响应$this->user->with('receipts')->has('receipts')->get(['id', 'name']);我曾尝试使用多种 laravel 集合方法https://laravel.com/docs/5.8/collections#available-methods 但我仍然无法获得所需的响应。    {        "id": 1,        "name": "kent",        "receipts": [            {                "id": 1,                "user_id": 1,                "type_id": 1,                "status": 0,                "amount": 100            },            {                "id": 2,                "user_id": 1,                "type_id": 1,                "status": 0,                "amount": 100            },            {                "id": 3,                "user_id": 1,                "type_id": 2,                "status": 1,                "amount": 50            },            {                "id": 4,                "user_id": 1,                "type_id": 2,                "status": 0,                "amount": 30            },            {                "id": 5,                "user_id": 1,                "type_id": 2,                "status": 0,                "amount": 30            },            {                "id": 6,                "user_id": 1,                "type_id": 1,                "status": 0,                "amount": 20            },            {                "id": 7,                "user_id": 1,                "type_id": 1,                "status": 1,                "amount": 10            }        ]        },        {            "id": 2,            "name": "allison",            "receipts": [                {                    "id": 9,                    "user_id": 2,                    "type_id": 1,                    "status": 0,                    "amount": 20                }        ]    }]
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

你应该能够得到金额的总和


$this->user->with(['receipts' => function($query) {

    $query->selectRaw("SUM(amount) as amount, type_id, status, user_id")->groupBy('type_id', 'status', 'user_id');

}])->has('receipts')->get(['id', 'name']);

您可以使用收集方法来获得所需的输出


$this->user->with(['receipts' => function($query) {

    $query->selectRaw("SUM(amount) as amount, type_id, status, user_id")->groupBy('type_id', 'status', 'user_id');

}])->has('receipts')->get(['id', 'name'])

->each(function ($user) {

    $user->setRelation(

        'receipts',

        $user->receipts->mapWithKeys(function ($receipt) {

            return [

                $receipt->type_id . ' and ' . $receipt->status => $receipt->amount // format the key as you wish

            ];

        })

    );

})


查看完整回答
反对 回复 2021-11-26
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

您可以使用 foreach 和其他循环来制作您想要的 json!使用此函数将您的集合转换为您想要的 json:


public function convert(Collection $collection) 

{

    $result_collection = $collection;

    $payment_collections = [];

    foreach ($result_collection->receipts as $receipt)

    {

        $payment["type_id${receipt->type_id} and status${$receipt->status}"] = $receipt->amount;

    }

    $result_collection->receipts = $payment_collections;

    return $result_collection;

}


这与获得总金额的方法相同。只需放置一个 foreach 并将每个数量添加到一个初始化为 0 的变量中;


还有其他方法,例如在您的Resource Collection 中更改 toArray 函数。


查看完整回答
反对 回复 2021-11-26
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我编写脚本时假设您的数据是一个 PHP 数组,因此您可以更改我的代码的某些部分。例如,您可以更改:


$row['receipts']

// To 

$row->receipts

反正


// The function in your controller

function index(){

  $users=User::whereHas('receipts')->with('receipts')->get()->toArray();

  return convert($users);

}

// The helper function 

function convert($data){

  $data=collect($data);

$allTypes=[];

$allStatuses=[];

return $data->each(function($row) use (&$allTypes,&$allStatuses){

    $types=collect($row['receipts'])->pluck('type_id')->toArray();

    $statuses=collect($row['receipts'])->pluck('status')->toArray();

    $allTypes=array_unique(array_merge($allTypes,$types));

    $allStatuses=array_unique(array_merge($allStatuses,$statuses));

})->map(function ($row,$index) use (&$allTypes,&$allStatuses){

    $result=[];

    $receipts=collect($row['receipts']);

    foreach ($allTypes as $type){

        foreach ($allStatuses as $status){

            $result["type_id {$type} and status {$status}: "]=$receipts->where('type_id',$type)->where('status',$status)->sum('amount');

        }

    }

    $row['receipts']=$result;

    return $row;

});

}

//img1.sycdn.imooc.com//61a0c1990001b1e903580396.jpg

查看完整回答
反对 回复 2021-11-26
  • 3 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信