首页 > 解决方案 > Yii2:如何使用 SQL 查询生成带有“分组依据”的 JSON 对象?

问题描述

我有一个 PostgreSQL 查询,其中包含这样的列地址价格。这是 SQL 查询结果的一个简单示例:

只是一个简单的 SQL 查询结果示例

我需要在 JSON 对象中发送这些先前的数据,并且它必须按地址分组。所以我需要这样的东西:

[  
   {
      "address":"Elm Street 123",
      "name": {
         "John",
         "Maria",
         "George"
      }
   },
   {
      "address":"Piccadilly Street 456",
      "name": {
         "Robert"
      }
   },
]

我尝试了下一个函数来生成我想要的 JSON 对象,但它没有生成我需要的 JSON 对象:

Yii::$app->response->format = Response::FORMAT_JSON;
$persons = persons::find()
    ->select([
        'address',
        'name',
    ])
    ->asArray()
    ->all();

return $persons;

它生成这个 JSON 对象:

[  
   {
      "address":"Elm Street 123",
      "name": "John"
   },
   {
      "address":"Elm Street 123",
      "name": "Maria"
   },
   {
      "address":"Piccadilly Street 456",
      "name": "Robert"
   },
   {
      "address":"Elm Street 123",
      "name": "George"
   },
]

我使用 Yii2 框架,所以我正在寻找 PHP 中的解决方案。也许 SQL 解决方案可以工作,但我不确定。

标签: phpsqljsonyii2grouping

解决方案


SQL(和 yii2)不能原生处理这个问题。所以我重新排列数组以制作结构:

Yii::$app->response->format = Response::FORMAT_JSON;
$persons = persons::find()
        ->select([
            'address',
            'name',
        ])
        ->asArray()
        ->all();
$result = [];
foreach ($persons as $person) {
    $address = $person['address'];
    if (!isset($result[$address])) {
        $result[$address] = ['address' => $address, 'name' => [],];
    }
    $result[$address]['name'][] = $person['name'];
}
return array_values($result);

推荐阅读