当前位置: 首页 > 知识库问答 >
问题:

如何计算在PHP中使用Laravel雄辩/集合类似键的总量

司寇星海
2023-03-14

我目前有API返回的以下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
                }
        ]
    }
]

我希望得到下面的答案

    {
        "id": 1,
        "name": "kent",
        "receipts": [
            {
                "performance and deleted": 220,
                "performance and not deleted": 10,
                "project and deleted": 60,
                "project and deleted": 50
            }
        ]
    },
    {
        "id": 2,
        "name": "allison",
        "receipts": [
            {
                "performance and deleted": 20,
                "performance and not deleted": 0,
                "project and deleted": 0,
                "project and not deleted": 0
            }
        ]
    }
]

共有3个答案

卫昊东
2023-03-14

我编写的脚本假设您的数据是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;
});
}
阚允晨
2023-03-14

您可以使用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的变量中;

还有其他方法,比如在资源集合中更改数组函数。

西门安宁
2023-03-14

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

$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
            ];
        })
    );
})
 类似资料:
  • 我正在用Laravel 5.2开发一个Web应用程序,但有一个问题我无法解决。 我有一个扩展了雄辩模型的模型,但当我试图输出带有“where”的数据库表时,例如 它返回一个包含许多信息的集合,这些信息此时对我来说无用,比如“守卫”、“键入”...我的表的数据在“属性”下。遵循laravel的指南,我看到每个人都像我一样简单地使用它,然后用

  • 问题内容: 我试图在Eloquent和Laravel中找到一种优雅的方式来表达 在Eloquent中是否存在一个between运算符(我找不到它)。 我到目前为止最接近的是像这样链接我的查询 我还遇到了似乎可行的地方 是否有处理范围的实际口才方法(不是原始方法)? 问题答案: 在这里查看:http : //laravel.com/docs/4.2/queries#selects 对于Laravel

  • 如何在不使用查询生成器的情况下,在Laravel4中创建一个新的雄辩的集合? 有一个方法,它可以被不真正起作用的方法覆盖,因为它只在查询集合结果时使用。 我在考虑建立一个空的集合,然后用有说服力的对象填充它。我不使用数组的原因是因为我喜欢雄辩的集合方法,比如。 如果还有其他选择,我很乐意听听。

  • 我正在编写php代码,对于当前的项目,我正在使用laravel框架(带有雄辩的ORM)。在这个项目中,我创建了两个表:用户和任务。我想在这些表之间创建一个“一对多”的关系。因此,一个用户可以有许多任务。在Tasks类中,我创建了方法所有者(): 但是当我以前得到用户名的时候 我得到这个异常:未定义的属性:illumb\Database\Eloquent\Relations\BelongsTo::$

  • 这可能是一个无关紧要的问题,但我想知道Laravel是否推荐某种方法来检查从

  • 我一直试图找出一种方法来记录SQL查询从雄辩的ORM,我在Zend框架1中使用。我遇到了这样调用的getQueryLog()方法: 我发现Illumb\Database\Connection包含getQueryLog()方法,因此我尝试执行以下操作: 但是,我得到以下通知,它返回NULL: 有人能建议我在拉威尔以外的地方怎么用这个吗?我在网上搜索过,看不到任何需要改变的地方,尽管我怀疑大多数例子都