node.js - Sequelize : "Include unexpected" on associated table query

标签 node.js postgresql sequelize.js

documents 表出现错误包括:
Include unexpected. Element has to be either a Model, an Association or an object. :

const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.documents,
      }
    ],
});
documents 相关部分定义和关联:
const document = sequelize.define(
    'document',
    {
      id: {
        allowNull: false,
        primaryKey: true,
        type: DataTypes.UUID,
        defaultValue: sequelize.literal('uuid_generate_v4()'),
      },
      user_id: {
        type: DataTypes.UUID,
        references: {
          model: 'users',
          key: 'id',
        },
      },
    }
  );
  document.associate = function(models) {
    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });
  };

PSquel 将文档表上的外键返回为:

键名:documents_user_id_fkey
列:user_id
国外表:users
国外栏目:id
这个 psql 查询为用户返回文档:
SELECT D
FROM users U
INNER JOIN documents D ON D.user_id = U.id

此查询包括查询 DOES 与 emails 表一起工作,并为用户返回电子邮件:
const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.emails,
      }
    ],
});
emails 相关部分定义和关联:
const Emails = sequelize.define(
    'emails',
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: sequelize.literal('uuid_generate_v4()'),
        primaryKey: true,
      },
      user_id: {
        type: DataTypes.UUID,
        references: {
          model: 'users',
          key: 'id',
        },
        allowNull: false,
      },
  );

  Emails.associate = models => {
    models.emails.belongsTo(models.users, {
      onDelete: 'CASCADE',
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });
  };

PSquel 返回 emails 表上的外键为:

键名:emails_user_id_fkey
列:user_id
国外表:users
国外栏目:id
为什么 documents 表的行为与 emails 不同?

注意:我最近确实将 Documents 的 Sequelize 关联从 name: id 更改为 user_id,我是否需要以某种方式重新初始化该关联?

它是从:
    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'id',
        allowNull: false,
      },
    });

至:
    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });

最佳答案

您必须引用正确的模型名称。你要么把它改成这样:

const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.document,
      }
    ],
});

或者你把它改成这样:
const document = sequelize.define('documents', ..

如果定义为 document ,则必须包含 document 而不是 documents

关于node.js - Sequelize : "Include unexpected" on associated table query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61190038/

相关文章:

node.js - 如何通过 Fitness REST API 从 Google 健身商店获取每日步数和活跃卡路里

javascript - 回调和模块导出有什么区别?

mongodb - mongoose 更新 MongoDB 中的字段不起作用

node.js - POST 多对多 express 请求

javascript - 使用NodeJS + HTML建立MySQL数据库似乎不起作用

sql - PostgreSQL 在建表主键中添加

sql - Postgresql 在同一张表上加入

SQL - 在 PostgreSQL 中以组的形式查找连续时间序列中的记录

node.js - Sequelize : findAll based on param if param is not null and just findAll if param is null

javascript - Sequelize - 我必须在哪里放置 "onDelete"选项