cube.js join 的处理
2021-03-02 14:26
                         标签:category   关联   res   tar   target   设置   注意   def   一对一    注意定义join 的relationship必须明确,不然可能会产生不一样的结果 hasMany  belongsTo  为了join 的正确处理,很多时候设置正确的主键也很必要,注意主键是在维度定义的 使用${CUBE} 可以引用当前的cube schema 定义,在处理join 的时候很有必要 cube.js 基于Dijkstra‘s algorithm 算法可以解决a-b,b-c 然后a-c 的关联问题  我们可以使用 https://cube.dev/docs/joins  cube.js join 的处理 标签:category   关联   res   tar   target   设置   注意   def   一对一    原文地址:https://www.cnblogs.com/rongfengliang/p/14332375.html支持join 模式
joins: {
  TargetCubeName: {
    relationship: `belongsTo` || `hasMany` || `hasOne`,
    sql: `SQL ON clause`
  }
}
注意所有的join 使用的默认是left join ,对于INNER JOIN 语义的支持可以基于检查对应的列是否不为空,可以通过set filter 解决 
参考{
  member: "Posts.authorName",
  operator: "set"
}
参数说明
hasOne 
一对一的关联cube("Users", {
  joins: {
    Profile: {
      relationship: `hasOne`,
      sql: `${Users}.id = ${Profile}.user_id`
    }
  }
});
定义一对多的场景,比如一个作者有多本书cube("Authors", {
  joins: {
    Books: {
      relationship: `hasMany`,
      sql: `${Authors}.id = ${Books}.author_id`
    }
  }
});
定义多对一的场景,比如一个客户有多个订单,对于order 与客户的关联就是订单属于客户cube("Orders", {
  joins: {
    Customers: {
      relationship: `belongsTo`,
      sql: `${Orders}.customer_id = ${Customers}.id`
    }
  }
});
定义关联的条件sql: `${Orders}.customer_id = ${Customers}.id`
设置主键
dimensions: {
  authorId: {
    sql: `id`,
    type: `number`,
    primaryKey: true
  }
}
cube 的引用
dimensions: {
  name: {
    sql: `${CUBE}.name`,
    type: `string`
  }
}
传递join
比如: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/direction-of-joins/