我在try 使用GROUP BY创建嵌套的多对象json数组时遇到困难 birth_place在我的REST API应用程序中,这是我在控制器中的代码:

$db = db_connect();
$data = [
    'status' => true,
    'error' => null,
    'data' => $db->query('SELECT birth_place, COUNT(id) as jumlah_data_user, GROUP_CONCAT(id) as id, GROUP_CONCAT(name) as name, GROUP_CONCAT(birth_date) as birth_date, GROUP_CONCAT(gender) as gender FROM users GROUP BY birth_place')->getResultArray()
];
return $this->respond($data, 200);

这就是我的结果,数据被成功地分组,但组合的数据没有被分成多维数组,使用CREATE NEW TITLE AS USERS,而是变成了组合的字符串.

"status": true,
"error": null,
"data": [
          {
           "birth_place": "Administrasi Jakarta Barat",
           "jumlah_data_user": "3",
           "id": "716,764,922",
           "name": "Elvina Nuraini,Rina Kezia Novitasari,Viktor Firmansyah M.Pd",
           "birth_date": "1975-08-28,1988-06-07,1989-05-13",
           "gender": "female,female,male"
          },
          {
           "birth_place": "Administrasi Jakarta Pusat",
           "jumlah_data_user": "2",
           "id": "993,866",
           "name": "Mursinin Banawa Marbun M.Pd,Ibrahim Gunawan",
           "birth_date": "1991-12-27,1995-01-01",
           "gender": "male,male"
          },
         ];

这是我在项目运行时预期的结果:

"status": true,
"error": null,
"data": [
    {
        "birth_place"     : "Administrasi Jakarta Barat",
        "jumlah_data_user" : 3,
        "users": [
            {
                "id": 716,
                "name": "Elvina Nuraini",
                "birth_date": "1975-08-28",
                "gender": "female"
            },
            {
                "id": 764,
                "name": "Rina Kezia Novitasari",
                "birth_date": "1988-06-07",
                "gender": "female"
            },
            {
                "id": 922,
                "name": "Viktor Firmansyah M.Pd",
                "birth_date": "1989-05-13",
                "gender": "male"
            }
        ]
    },
    {
        "birth_place": "Administrasi Jakarta Pusat",
        "jumlah_data_user" : 2,
        "users": [
            {
                "id": 993,
                "name": "Mursinin Banawa Marbun M.Pd",
                "birth_date": "1991-12-27",
                "gender": "male"
            },
            {
                "id": 866,
                "name": "Ibrahim Gunawan",
                "birth_date": "1995-01-01",
                "gender": "male"
            }
        ]
    },
];

如何做到这一点?

推荐答案

要重组分组的数据,您需要迭代行,然后分解并转置包含分隔字符串的最后四列.(Demo)

$data = array_map(
    fn($row) => [
        'birth_place' => $row['birth_place'],
        'jumlah_data_user' => $row['jumlah_data_user'],
        'users' => array_map(
            fn(...$col) => array_combine(['id', 'name', 'birth_date', 'gender'], $col),
            explode(',', $row['id']),
            explode(',', $row['name']),
            explode(',', $row['birth_date']),
            explode(',', $row['gender'])
        )
    ],
    $this->Users_model->getGroupedByBirthPlace();
);

话虽如此,还是有一些重要的建议可以提出来:

  1. 在MVC框架中,我们应该看不到从控制器执行的数据库查询.此任务的控制器工作是从模型收集数据(模型中的一个方法将收集数据库数据),然后返回响应有效负载.

  2. 对于此任务,不建议在SQL中进行分组和串联.

    • 对这些连接的字符串有数据长度限制,
    • 当值包含逗号时,则存在分隔符冲突,并且
    • 您正在不必要地增加数据库的工作负载.

    如果您减少了结果集的小众程度,它将使您的模型方法更具可重用性.一个好的模型具有可以在整个项目中多次使用的方法.

  3. 尽量不要把英语和马来语(或其他非英语语言)混在一起.如果语言一致,该项目将更容易管理和审查.我建议是group_total英镑而不是jumlah_data_user英镑.

使用来自模型查询的更简单的有效负载,不需要进行迭代的分解和转置过程.这是设计应用程序的更专业的方法.(Demo)

$grouped = array_values(
    array_reduce(
        $this->Users_model->get(), // call the method whatever you like
        function($data, $row) {
            $group = $row['birth_place'];
            $data[$group] ??= [
                'birth_place' => $row['birth_place'],
                'group_total' => 0
            ];
            ++$data[$group]['group_total'];
            unset($row['birth_place']);
            $data[$group]['users'][] = $row;
            return $data;
        }
    )
);

Php相关问答推荐

Woocommerce自定义变体html表仅显示带值的列

在php中有没有办法比较两个包含相同枚举类型的枚举数组

WooCommerce产品按特定元数据的自定义数字排序选项

如何删除WordPress用户的个人资料描述或其他个人资料字段中的链接?

PHP原始数据读取引发max_input_vars错误

为什么正则表达式与得到的文本块之前得到的也行?

在Laravel中修改JSON输出

PHP从响应应用程序json获取文件代码和URL

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

Laravel路由到控制器传输变量解决方案需要

$this->;db->;update();CodIgnitor中的功能不工作

既然setSQLLogger()已被弃用,如何使用中间件在 Doctrine 3 中记录查询执行时间?

如何在 Phpunit 的静态提供程序中创建测试双打?

在shopware 6.5上可以使用什么事件来判断刚刚支付的订单的状态

PHP简单地将物品装在盒子里会导致未使用的空间,但还有剩余容量

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

Symfony 6 中的入口点 (public/index.php) - 它是如何工作的?

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?

即使密码匹配,密码处理程序也会返回错误

Laravel 响应 html 默认页面忽略控制器