mysql - 序列化 findAll 和 Join 表

标签 mysql join sequelize.js

我想做一个简单的聊天应用程序,我的表格是这样的(我不知道这是否是实现它的正确方法):

var User = sequelize.define('User', {
userName: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
classMethods: {
  associate: function(models) {
    User.hasMany(models.Friend);
  }
}

friend 们:

var Friend = sequelize.define('Friend', {
realId: DataTypes.INTEGER,
invitStatus: DataTypes.STRING
}, {
classMethods: {
  associate: function(models) {
    Friend.hasMany(models.Message);
  }

消息:

var Message = sequelize.define('Message', {
text: DataTypes.TEXT,
sentBy: DataTypes.INTEGER
}, {
classMethods: {
  associate: function(models) {
}

这是我当前的查询:

models.User.findAll({
        where: {
            id: req.payload.userId
        },
        include: [{
            model: models.Friend,
            include: [{
                model: models.Message,
                order: [['createdAt', 'DESC']],
                limit: 1
            }]
        }]

    }).then(function(result) {
            reply(result).code(200);
        })
    }

一切工作正常,除了我想告诉sequelize从User表中获取Friend数据以及从Friend表中获取realId。 我应该使用关键字“through”吗?尽管我多次阅读了文档,但我还是不明白它是如何工作的。我是 SQL 初学者。

感谢您的帮助。

编辑:我当前的输出是:

{
"id": 2,
"userName": "user2",
"email": "user2@example.com",
"password": "123456",
"createdAt": "2016-05-26T16:28:02.000Z",
"updatedAt": "2016-05-26T16:28:13.000Z",
"Friends": [
  {
    "id": 1,
    "realId": 1,
    "invitStatus": "accepted",
    "createdAt": "2016-05-26T16:30:15.000Z",
    "updatedAt": "2016-05-26T16:30:15.000Z",
    "UserId": 2,
    "Messages": [
      {
        "id": 18,
        "text": "ok",
        "sentBy": 1,
        "createdAt": "2016-05-26T16:59:36.000Z",
        "updatedAt": "2016-05-26T16:59:36.000Z",
        "FriendId": 1
      }
    ]
  }

我想要的是将值“userName”、“email”和“password”添加到 Friends 数组中,方法是使用“Friend.realId = User.id”从 User 表中获取值。

最佳答案

我不确定是否清楚地理解您的问题。我假设 Friends 通过 realId 链接到 User,因此您不应该有 Friends 模型,而只有一个 User 模型。

如果这个答案可以帮助任何人,在这种情况下,您可能应该使用自关联

您可以通过类似的方式实现用户和用户(作为 friend )之间的自关联

User.belongsToMany(models.User, { as: 'friends', foreignKey: 'userId', through: 'User_Friends' });

如果您的 User_Friends 模型需要其他属性,您可以像下面这样指定它们,否则将自动创建此连接表。

var User_Friends = sequelize.define('User_Friends', {
    // ...
    invitStatus: DataTypes.STRING
    // ...
}

关于mysql - 序列化 findAll 和 Join 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496521/

相关文章:

mysql - 显示表格中的随机问题,不重复

node.js - 如何使用 'has-many belongs-to relationaship' 访问 node.js 中的记录?

mysql - Rails - 库未加载 : @@HOMEBREW_PREFIX@@/opt/openssl/lib/libssl. 1.0.0.dylib (LoadError)

mysql存储过程由于Case找不到表

php - 如何将 SQL where 子句与多个 if 语句一起使用

java - 如何在 Java 中为表 JOINS 实现 DAO/DTO?

mysql - 只列出在 mysql 中出现三次的行

mysql - 在mysql中连接具有特定条件的两个表

sequelize.js - sequelize - 使用泛型类型从普通对象创建模型

node.js - 使用 Sequelize (Postgres) 进行全文搜索