PHP Heredoc构造CRM订单数据:同一订单多商品合并问题求助
问题
通过PHP将网站订单数据同步至CRM系统,使用Heredoc构造请求数据。现有两张商品表:tblitemable(含rel_id关联订单)和tblitems(含sk_key、main_key等商品信息)。通过MySQL关联查询获取数据后,当前代码循环每条记录生成独立订单,但同一rel_id对应同一订单的多个商品被拆分为独立订单(本该生成3个订单却生成了4个),需要将同一订单的所有商品合并到单个订单的order_rows数组中。
表结构
tblitemable表
| id | rel_id | rel_type | description |
|---|---|---|---|
| 11 | 9 | invoice | product1 |
| 12 | 10 | invoice | product2 |
| 13 | 11 | invoice | product3 |
| 14 | 9 | invoice | product4 |
tblitems表
| id | sk_key | main_key | description |
|---|---|---|---|
| 35 | 99 | 0000001 | product1 |
| 36 | 89 | 0002331 | product2 |
| 37 | 76 | 0000043 | product3 |
| 48 | 65 | 0000123 | product4 |
当前代码问题
循环构造订单代码(问题点:每条记录生成独立订单)
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); }
说明
- 分组逻辑:通过
rel_id作为订单唯一标识,将同一订单的商品统一收集到order_rows数组,确保一个订单仅生成一条请求。 - 替代Heredoc:使用数组转JSON的方式更可靠,避免Heredoc中容易出现的多余逗号、引号不匹配等JSON语法错误。
- 修正原代码问题:修复了查询中的变量拼写错误,同时调整了
order_kind_service等字段的位置(原代码错误地将这些字段放在order_rows数组内)。
内容的提问来源于stack exchange,提问作者imp
相关产品推荐
相关产品推荐

