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

我目前有 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

                }

        ]

    }

]


慕森王
浏览 139回答 3
3回答

慕容708150

你应该能够得到金额的总和$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            ];        })    );})

明月笑刀无情

您可以使用 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 函数。

沧海一幻觉

我编写脚本时假设您的数据是一个 PHP 数组,因此您可以更改我的代码的某些部分。例如,您可以更改:$row['receipts']// To $row->receipts反正// The function in your controllerfunction 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;});}
打开App,查看更多内容
随时随地看视频慕课网APP