使用 sequelize 通过相同两个表之间的单独联结表进行查询

Posted

技术标签:

【中文标题】使用 sequelize 通过相同两个表之间的单独联结表进行查询【英文标题】:Use sequelize to query by separate junction tables between same two tables 【发布时间】:2015-11-05 10:44:42 【问题描述】:

SQLite3- 我有一个 users 表和一个 songNodes 表。用户可以喜欢歌曲,并且用户可以“分叉”歌曲。我有两个单独的联结表,它们按目的表示这些唯一但在其他方面相同的关系。

Sequelize- 我知道如何在 sequelize 中执行联结查询的唯一方法如下-

var myForks = function(userId, callback) 
  User.findOne(
    where: 
      id: userId
    
  )
  .then(function(userObj) 
    userObj.getSongNodes()  //this is where I need to specify
    .then(function(stuff)  //a junction table
      callback(stuff);
    )
  )
;

我已尝试对此进行广泛研究,但找不到指定要与自动生成的函数“getSongNodes”一起使用的联结表的方法。任何帮助/指导将不胜感激!

【问题讨论】:

你也可以显示关联吗? 'users' 和 'songNodes' 之间通过'favorite'、'fork' 和'upvote' 3 多对多关系 【参考方案1】:

我猜你有三个表,分别是 User、Song、SongNode。您必须定义它们之间的关联。

您可以定义如下几行的关联;

models.User.belongsToMany(models.Song, 
  "constraints": false,
  "foreignKey": "userId",
  "through": 
    model: models.SongNode,
      unique: false
  
);

models.Song.belongsToMany(models.User, 
  "constraints": false,
  "foreignKey": "songId",
  "through": 
    model: models.SongNode,
    unique: false
  
);

之后;你可以像这样使用模型之间的关系;

var myForks = function(userId, callback) 
  User
    .findOne(
      "where":  "id": userId 
     )
    .then(function(user) 
      user
        .getSongNodes()
        .then(function(songNodes) 
          callback(songNodes);
        );
    );
;

或者你也可以喜欢这个;

var myForks = function(userId, callback) 
  User
    .findOne(
      "where":  "id": userId ,
      "include": [Song]
     )
    .then(function(user) 
      callback(user.Songs);
    );
;

我希望它有效

【讨论】:

我有用户表和 SongNodes 表。我有 3 个用于这 2 个表的联结表(用户有许多“最喜欢的”歌曲节点/歌曲节点被许多用户喜爱,“叉子”和“upvote”的关系相同)。我暂时编写了原始查询,但我认为 ORM 应该支持这一点。

以上是关于使用 sequelize 通过相同两个表之间的单独联结表进行查询的主要内容,如果未能解决你的问题,请参考以下文章

sequelize include,连接两个关联表

使用两个字段在两个表之间创建关系

Sequelize - 在 where 子句中查询其他表

如何在Nodejs中使用Sequelize在没有公共列的两个表上进行INNER JOIN?

Mean Stack -> Sequelize Mysql 关联

Sequelize Find belongsToMany 关联