【问题标题】:Sequelize: many-to-many relationship to self, through another table?Sequelize:通过另一个表与自我建立多对多关系?
【发布时间】:2021-12-11 05:44:38
【问题描述】:

sequelize.js中,是否可以通过另一个表将一个表关联到自身?

我正在尝试创建一个基本的图形模型。我有两个相关的表:NodeEdge。我希望通过Edge 构建从Node 到自身的多对多关系。

示例:有一个名为“Dave”的Node,一个带有predicate“Loves”的Edge,以及另一个名为“Sarah”的Node

Node 表中,id 是主键。在Edge 表中,字段subject_node_iddirect_object_node_id 应指向节点id

这是我想要做的快速而肮脏的ERD:

这是迄今为止我最好的尝试。以下代码可以创建表列,但未按预期创建行。 create 方法可能完全错误;比如应该有办法设置predicate,但是不知道放在哪里:

const { Sequelize } = require("sequelize");

(async () => {
  try {
    const db = await new Sequelize({
      dialect: "sqlite",
      storage: "./db/db.db",
    });
    
    const Node = await db.define("node", {
      name: {
        type: Sequelize.STRING,
      },
    });
    
    const Edge = await db.define("edge", {
      subject_node_id: {
        type: Sequelize.INTEGER,
      },
      predicate: {
        type: Sequelize.STRING,
      },
      direct_object_node_id: {
        type: Sequelize.INTEGER,
      },
    });

    await Node.sync({ force: true });
    await Edge.sync({ force: true });

    await Node.belongsToMany(Node, {
      through: "Edge",
      as: "subjects",
      foreignKey: "id",
      otherKey: "subject_node_id"
    });

    await Node.belongsToMany(Node, {
      through: "Edge",
      as: "direct_objects",
      foreignKey: "id",
      otherKey: "direct_object_node_id"
    });
    
    await Node.create(
      {
        name: "Dave",
        // Loves ??
        subjects: [{
          name: "Sarah"
        }]
      },
    );

    console.log("created");
  } catch (error) {
    console.error(error);
  }
})();

我确实找到了this SO thread,但接受的答案并没有完全到达那里。有什么额外的想法吗?谢谢。

【问题讨论】:

    标签: node.js sqlite sequelize.js graph-theory entity-relationship


    【解决方案1】:

    我想通了:

    const { Sequelize, DataTypes } = require("sequelize");
    
    (async () => {
      try {
        const db = await new Sequelize({
          dialect: "sqlite",
          storage: "./db/db.db",
        });
    
        const Node = db.define("node", {
          name: DataTypes.STRING,
        });
        const Edge = db.define("edge", {
          subjectId: DataTypes.INTEGER,
          predicate: DataTypes.STRING,
          dobjectId: DataTypes.INTEGER,
        });
    
        await Node.belongsToMany(Node, {
          through: Edge,
          as: "subjects",
          foreignKey: "dobjectId",
        });
    
        await Node.belongsToMany(Node, {
          through: Edge,
          as: "dobjects",
          foreignKey: "subjectId",
        });
    
        await db.sync({force: true});
    
        const dave = await Node.create({ name: "Dave" });
        const sarah = await Node.create({ name: "Sarah" });
    
        await dave.addDobject(sarah, { through: {
          predicate: "Loves"
        }});
        await sarah.addDobject(dave, { through: {
          predicate: "Loves"
        }});
    
        const result = await Node.findOne({
          where: { name: "sarah" },
          include: ["subjects", "dobjects"],
        });
        console.log(result);
    
        console.log("created");
      } catch (error) {
        console.error(error);
      }
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多