繁体   English   中英

与模型关联的 Sequelize 和 defaultScope

[英]Sequelize and defaultScope with Models associated

我将 Sequelize 与 Express 和 Node js 一起使用,我正在尝试为模型定义 defaultScope。 Card 和 Tag 具有多对多关联。 这是模型定义和 addScope

// Models Associations

// ONE TO MANY
List.hasMany(Card, {
  as: "cards",
});
Card.belongsTo(List, {
  as: "list",
});

// MANY TO MANY
Card.belongsToMany(Tag, {
  as: "tags",
  through: "card_has_tag",
  updatedAt: false,
});
Tag.belongsToMany(Card, {
  as: "cards",
  through: "card_has_tag",
  updatedAt: false,
});

// SCOPES
Card.addScope("defaultScope", {
  include: {
    association: "tags",
  },
});

List.addScope("defaultScope", {
  include: {
    association: "cards",
    include: "tags",
  },
});

// What I would like to implement
// If I comment lines below => List and Card queries are working
Tag.addScope("defaultScope", {
  include: {
    association: "cards",
  },
});

我想默认打印所有具有关联关系的相关信息。

我想在为每个模型执行 sequelize 查询时获取此信息。

  1. 与相关的列表:
  • 标签
  1. 相关卡片:
  • 标签
  1. 相关标签:

我设法得到 1 和 2,但是当我添加Tag.addScope时,一切都不再起作用了。

当我通过定义范围all (例如)将defaultScope更改为另一个字符串时,以及当我使用model.scope("all").findAll()时,这是有效的,但这不是我想做的,因为我想使用 defaultScope 来获得默认行为,这样我就不必在查询命令中指定范围,例如 (findAll...)

有什么办法可以做到吗?

您尝试设置它的方式会导致无休止的递归,您根本不能那样做。

如果您这样设置并查询Card ,它将包含Tag ,其中包含Card ,其中包含Tag等等,直到您获得Maximum call stack size exceeded

您可以使用一种解决方法,即添加另一个不包含任何内容的范围,然后在defaultScope中为模型指定该范围。

 Tag.addScope("noInclude", {}); Card.addScope("noInclude", {}); Tag.addScope("defaultScope", { include: [ { model: Card.scope("noInclude"), as: "cards" } ] }); Card.addScope("defaultScope", { include: [ { model: Tag.scope("noInclude"), as: "cards" } ] });

这应该会给你想要的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM