You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Heredoc构造CRM订单数据:同一订单多商品合并问题求助

问题

通过PHP将网站订单数据同步至CRM系统,使用Heredoc构造请求数据。现有两张商品表:tblitemable(含rel_id关联订单)和tblitems(含sk_key、main_key等商品信息)。通过MySQL关联查询获取数据后,当前代码循环每条记录生成独立订单,但同一rel_id对应同一订单的多个商品被拆分为独立订单(本该生成3个订单却生成了4个),需要将同一订单的所有商品合并到单个订单的order_rows数组中。

表结构

tblitemable表

idrel_idrel_typedescription
119invoiceproduct1
1210invoiceproduct2
1311invoiceproduct3
149invoiceproduct4

tblitems表

idsk_keymain_keydescription
35990000001product1
36890002331product2
37760000043product3
48650000123product4

当前代码问题

循环构造订单代码(问题点:每条记录生成独立订单)

foreach ($rows as $ordert) {
    $customer = $ordert['c_code'];
    $sk_key = $ordert['sk_key'];
    $main_key = $ordert['main_key'];

    $data = <<<EOT
    {"add_order" :
        {"session_id": "$session_id",
         "order":
                {
                "customer_code": {"c_code": "$customer"},
                "warehouse": {"warehousecode": "FB001"},
                "order_rows": [{ 
                              "sk_key": "$sk_key",
                              "main_key": "$main_key",
                                   "m_variants": [{ 
                                        "variant1": 0,
                                        "variant2": 0,}]},
                              "order_kind_service": "$order_kind_service",
                              "order_unit_service": "$order_unit_service",}],
                "shipping": "$shipping",
                "billing": "$billing",
              }
        }
  }
             EOT;
}

数据查询代码(存在拼写错误:$senderoder应为$sendorder)

$sendorder = $mysqli->query
('SELECT * FROM tblcustomfieldsvalues a 
INNER JOIN tblinvoices b ON a.relid = b.id
INNER JOIN tblclients c ON b.clientid = c.userid
INNER JOIN tblitemable d ON b.id = d.rel_id
INNER JOIN tblitems e ON e.description = d.description
WHERE a.value = "Yes"');
$rows = $senderoder->fetch_all(MYSQLI_ASSOC);
echo json_encode($rows);

修正方案

步骤1:对查询结果按订单ID分组

先将$rows中的数据按订单ID(即rel_id,对应tblinvoices.id)分组,把同一订单的所有商品收集到一起:

// 修正查询拼写错误
$sendorder = $mysqli->query('SELECT * FROM tblcustomfieldsvalues a 
INNER JOIN tblinvoices b ON a.relid = b.id
INNER JOIN tblclients c ON b.clientid = c.userid
INNER JOIN tblitemable d ON b.id = d.rel_id
INNER JOIN tblitems e ON e.description = d.description
WHERE a.value = "Yes"');
$rows = $sendorder->fetch_all(MYSQLI_ASSOC);

// 按订单ID(rel_id)分组,整理订单数据
$groupedOrders = [];
foreach ($rows as $row) {
    $orderId = $row['rel_id']; // 订单唯一标识
    // 初始化基础订单信息(仅第一次遇到该订单时执行)
    if (!isset($groupedOrders[$orderId])) {
        $groupedOrders[$orderId] = [
            'customer_code' => $row['c_code'],
            'shipping' => $row['shipping'], // 若为固定值可直接写死,如"shipping_value"
            'billing' => $row['billing'],   // 同理billing
            'order_rows' => []
        ];
    }
    // 向当前订单添加商品行
    $groupedOrders[$orderId]['order_rows'][] = [
        'sk_key' => $row['sk_key'],
        'main_key' => $row['main_key'],
        'm_variants' => [
            ['variant1' => 0, 'variant2' => 0]
        ]
    ];
}

步骤2:循环分组后的订单构造请求数据

遍历分组后的订单,为每个订单生成包含所有商品的JSON请求:

foreach ($groupedOrders as $order) {
    // 用数组构造数据再转JSON,避免Heredoc的语法错误
    $requestData = [
        'add_order' => [
            'session_id' => $session_id,
            'order' => [
                'customer_code' => ['c_code' => $order['customer_code']],
                'warehouse' => ['warehousecode' => 'FB001'],
                'order_rows' => $order['order_rows'],
                'order_kind_service' => $order_kind_service,
                'order_unit_service' => $order_unit_service,
                'shipping' => $order['shipping'],
                'billing' => $order['billing']
            ]
        ]
    ];
    // 转为JSON字符串,避免中文转义
    $data = json_encode($requestData, JSON_UNESCAPED_UNICODE);
    
    // 此处添加发送请求到CRM的逻辑,例如curl调用
    // $ch = curl_init('CRM接口地址');
    // curl_setopt($ch, CURLOPT_POST, 1);
    // curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    // curl_exec($ch);
}

说明

  1. 分组逻辑:通过rel_id作为订单唯一标识,将同一订单的商品统一收集到order_rows数组,确保一个订单仅生成一条请求。
  2. 替代Heredoc:使用数组转JSON的方式更可靠,避免Heredoc中容易出现的多余逗号、引号不匹配等JSON语法错误。
  3. 修正原代码问题:修复了查询中的变量拼写错误,同时调整了order_kind_service等字段的位置(原代码错误地将这些字段放在order_rows数组内)。

内容的提问来源于stack exchange,提问作者imp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:15:32