如何在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组件处理查询结果:
- 先执行查询获取所有符合条件的销售订单(命名为
getSalesOrders) - 再执行查询获取所有关联的订单项(通过销售订单ID过滤,命名为
getLineItems) - 添加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
相关产品推荐
相关产品推荐

