cube.js join 的处理

支持join 模式

  • 参考格式
joins: {
  TargetCubeName: {
    relationship: `belongsTo` || `hasMany` || `hasOne`,
    sql: `SQL ON clause`
  }
}
  • 说明
    注意所有的join 使用的默认是left join ,对于INNER JOIN 语义的支持可以基于检查对应的列是否不为空,可以通过set filter 解决
    参考
 
{
  member: "Posts.authorName",
  operator: "set"
}

参数说明

注意定义join 的relationship必须明确,不然可能会产生不一样的结果

  • relationship
    hasOne
    一对一的关联
 
cube("Users", {
  joins: {
    Profile: {
      relationship: `hasOne`,
      sql: `${Users}.id = ${Profile}.user_id`
    }
  }
});

hasMany
定义一对多的场景,比如一个作者有多本书

 
cube("Authors", {
  joins: {
    Books: {
      relationship: `hasMany`,
      sql: `${Authors}.id = ${Books}.author_id`
    }
  }
});

belongsTo
定义多对一的场景,比如一个客户有多个订单,对于order 与客户的关联就是订单属于客户

 
cube("Orders", {
  joins: {
    Customers: {
      relationship: `belongsTo`,
      sql: `${Orders}.customer_id = ${Customers}.id`
    }
  }
});
  • sql
    定义关联的条件
 
sql: `${Orders}.customer_id = ${Customers}.id`

设置主键

为了join 的正确处理,很多时候设置正确的主键也很必要,注意主键是在维度定义的

dimensions: {
  authorId: {
    sql: `id`,
    type: `number`,
    primaryKey: true
  }
}

cube 的引用

使用${CUBE} 可以引用当前的cube schema 定义,在处理join 的时候很有必要

dimensions: {
  name: {
    sql: `${CUBE}.name`,
    type: `string`
  }
}

传递join

cube.js 基于Dijkstra's algorithm 算法可以解决a-b,b-c 然后a-c 的关联问题
比如:

 
cube(`A`, {
  // ...
  joins: {
    B: {
      sql: `${A}.b_id = ${B}.id`,
      relationship: `belongsTo`
    }
  },
  measures: {
    count: {
      type: `count`
    }
  }
});
cube(`B`, {
  // ...
  joins: {
    C: {
      sql: `${B}.c_id = ${C}.id`,
      relationship: `belongsTo`
    }
  }
});
cube(`C`, {
  // ...
  dimensions: {
    category: {
      sql: `category`,
      type: `string`
    }
  }
}); 

我们可以使用

{
  measures: ['A.count'],
  dimensions: ['C.category']
}

参考资料

https://cube.dev/docs/joins
https://cube.dev/docs/direction-of-joins/

posted on   荣锋亮  阅读(195)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-01-26 deno学习五 typescript + vscode 集成
2020-01-26 makeself 试用
2017-01-26 好的产品经理,差的产品经理
2016-01-26 docker 镜像的保存以及导入
2016-01-26 docker 数据共享,数据复制
2016-01-26 docker nodejs 基本应用

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示