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

如何使用laravel/php手动映射集合并获取总量

宁弘亮
2023-03-14

我目前有API返回的以下json响应。我能用拉威尔的口才把它还给你。有几个用户,每个用户都有几个收据。收据具有类型和状态。我想尝试获取与类型和状态相关的每个收据的总金额。我能够使用

$this-

我尝试过使用多种laravel collections方法https://laravel.com/docs/5.8/collections#available-方法,但我仍然无法获得所需的响应。

[
  {
    "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
      }
    ]
  }
]

我主要关心的是使用laravel收集方法和易于阅读的代码来获得预期的结果


共有2个答案

纪辰沛
2023-03-14

我想这会有帮助的

$user->receipts->sum('amount');
段干靖
2023-03-14

通过这种方式,我相信您可以通过良好的可读代码获得预期的结果。

我假设您有$user变量,其中包含集合中的用户列表(可能收据已经加载)。

// You need to name the keys as you desire. (I can't figure out the labels by the type_id and status numbers).
$statusPair = collect([
    'performance and deleted' => [
        'type_id' => 1,
        'status'  => 0,
    ],
    'something'               => [
        'type_id' => 1,
        'status'  => 1,
    ],
    'something 2'             => [
        'type_id' => 2,
        'status'  => 0,
    ],
    'something 3'             => [
        'type_id' => 2,
        'status'  => 1,
    ],
]);

$data = $users->map(function ($user) use ($statusPair) {
    $receipts = $user->receipts;

    $sums = $statusPair->mapWithKeys(function ($pair, $statusLabel) use ($receipts) {
        $filtered = $receipts;
        foreach ($pair as $key => $value) {
            $filtered = $filtered->where($key, $value);
        }
        $sum = $filtered->sum('amount');

        return [
            $statusLabel => $sum,
        ];
    });

    return [
        'id'       => $user->id,
        'name'     => $user->name,
        'receipts' => $sums->toArray(),
    ];
});
 类似资料:
  • 问题内容: 我正在尝试确定是否有可能让JPA保留具有具体实现的抽象集合。 到目前为止,我的代码如下所示: 但是我一直在绊脚石下面的映射错误,我真的不知道这是否可行? 更新 我不认为问题出在抽象类上,而是 @MappedSuperClass 批注。看起来jpa不喜欢使用 @MappedSuperClass 映射一对多关系。如果我将抽象类更改为具体类,则会遇到相同的错误。 如果我然后更改为 @Enti

  • 假设我有以下映射目标。 如何从其他属性的Iterable映射到其他属性? 我可以这样做吗?

  • 我想合并两个地图与JAVA 8流: 我尝试使用以下实现: 但是,此实现只会产生如下结果:

  • 我目前有API返回的以下json响应。我能用拉威尔的口才把它还给你。有几个用户,每个用户都有几个收据。收据具有类型和状态。我想尝试获取与类型和状态相关的每个收据的总金额。我能够使用 我尝试使用多个laravel集合方法https://laravel.com/docs/5.8/collections#available-methods但我仍然无法获得所需的响应。 我希望得到下面的答案

  • 主要内容:集合类型,以下是纠正/补充内容:集合(Collection)是一个将多个对象分组为一个单元的java框架。它用于存储,检索和操作汇总数据。 在JPA中,可以使用集合来持久化包装类和String的对象。JPA允许三种对象存储在映射集合中 - 基本类型,实体和嵌入式类型。 集合类型 根据要求,我们可以使用不同类型的集合来持久化对象。如下所示 - List Set Map 包中包含集合框架的所有类和接口。 以下是纠正/补充内容: 根据

  • 我正在开发和spring应用程序,对于对象映射,我使用ModelMapper库。 我能够映射基本类映射,但当我尝试映射2个集合元素时,源是一组枚举,具有其他属性,如名称和描述,目标是具有id、名称和描述的pojo。 我已经尝试了类型地图和转换器在映射配置文件,但我得到例外的映射器。 源类来自其他应用程序(其依赖项已在pom.xml中添加)。我也不希望源类型作为目标setter中的参数。 前。 资料