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

如何在Retool Workflow中关联销售订单与订单项生成JSON数据

最优实现方案:Retool Workflow 生成含订单项数组的销售订单JSON

方案一:SQL原生聚合(推荐)

直接通过SQL查询将订单项聚合为JSON数组,一步到位完成数据结构整理,性能和效率最优,无需在Retool中做复杂循环处理。

以PostgreSQL为例,参考查询语句:

SELECT
  so.id AS order_id,
  so.customer_name,
  so.shipped_date,
  -- 聚合关联订单项为JSON数组
  json_agg(
    json_build_object(
      'line_item_id', li.id,
      'product_name', li.product_name,
      'quantity', li.quantity,
      'unit_price', li.unit_price
    )
  ) AS line_items
FROM sales_orders so
JOIN line_items li ON so.id = li.sales_order_id
WHERE so.shipped = TRUE AND so.shipped_date >= NOW() - INTERVAL '7 days' -- 筛选最新已发货订单
GROUP BY so.id, so.customer_name, so.shipped_date;
  • 核心优势:数据库层面完成数据聚合,Retool仅需执行一次查询,直接输出符合Carbone.io要求的JSON结构,避免循环带来的性能损耗和代码复杂度。
  • 注意事项:不同数据库的JSON聚合函数存在差异,比如MySQL使用JSON_ARRAYAGG(),SQL Server需结合STRING_AGG()与JSON_OBJECT()实现,需根据你的数据库类型调整语法。

方案二:Retool Workflow 内数据合并(备选)

若因权限或数据库功能限制无法使用SQL聚合,可在Retool中借助Transformer组件处理查询结果:

  1. 先执行查询获取所有符合条件的销售订单(命名为getSalesOrders)
  2. 再执行查询获取所有关联的订单项(通过销售订单ID过滤,命名为getLineItems)
  3. 添加Transformer组件,用JS代码合并数据:
// 按销售订单ID分组订单项
const lineItemsByOrder = getLineItems.reduce((acc, item) => {
  const orderId = item.sales_order_id;
  if (!acc[orderId]) acc[orderId] = [];
  acc[orderId].push({
    line_item_id: item.id,
    product_name: item.product_name,
    quantity: item.quantity,
    unit_price: item.unit_price
  });
  return acc;
}, {});

// 合并销售订单与对应订单项数组
return getSalesOrders.map(order => ({
  order_id: order.id,
  customer_name: order.customer_name,
  shipped_date: order.shipped_date,
  line_items: lineItemsByOrder[order.id] || []
}));
  • 适用场景:数据库不支持JSON聚合、或无法修改SQL查询的情况。
  • 局限性:需要两次查询,数据量大时可能存在性能瓶颈,且依赖Retool的JS逻辑维护。

总结

优先选择方案一,SQL原生聚合生成目标JSON结构的方式,在性能、维护成本上都更具优势,可直接对接Carbone.io的导入需求;若存在数据库功能或权限限制,再考虑方案二的Retool内数据处理方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:45:46