NodeJS Sequelize和defaultScope以及关联的模型

wpx232ag  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(173)

我正在使用Sequelize和Express,以及Node js,并且尝试为模型定义defaultScope。Card和Tag具有多对多关联。

// 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...)中指定作用域
我有办法做到吗?

kxe2p93d

kxe2p93d1#

你试图设置它的方式导致了一个无休止的递归,你不能这样做。
如果您这样设置它并查询Card,它将包括TagTag将包括CardCard将包括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"
    }
  ]
});

这应该会给你提供所需的行为。

相关问题