【问题标题】:Sequelize: "Include unexpected" on associated table querySequelize:关联表查询中的“包括意外”
【发布时间】:2020-04-14 01:31:03
【问题描述】:

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,
      },
    });
  };

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

键名: documents_user_id_fkey

列: user_id

外表: users

外栏: id

这个 psql 查询会为用户返回文档:

SELECT D
FROM users U
INNER JOIN documents D ON D.user_id = U.id

此查询包括查询确实可以使用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,
      },
    });
  };

PSequel 将emails 表上的外键返回为:

键名: emails_user_id_fkey

列: user_id

外表: users

外栏: id

为什么documents 表的行为与emails 不同?

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

原来是这样的:

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

收件人:

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

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    您必须引用正确的型号名称。您可以将其更改为:

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

    或者你把它改成这样:

    const document = sequelize.define('documents', ..
    

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

    【讨论】:

      猜你喜欢
      • 2015-07-27
      • 2017-07-28
      • 1970-01-01
      • 2017-03-10
      • 2016-09-30
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多