首页 > 解决方案 > Sequelize belongsTo 关联给出错误“表名“联系人”指定了不止一次”

问题描述

我正在尝试通过phone模型将模型连接到contact模型contact_phone。当我.findAll喜欢下面时,错误返回:未处理的拒绝 SequelizeDatabaseError:表名“联系人”指定了多次。在这种情况下,关联/“as”是否正确?当我尝试包含contact_phone模型时会发生错误。我还插入了带有初始电话行的表格。

exports.findAll = (req, res) => {
  models.contact.findAll({
    include: [
      { 
        model: models.contact_phone, 
        as: 'contact'
      } 
    ]
  })
    .then(contacts => {
    res.status(200).send(contacts);
  });
};

楷模

module.exports = (sequelize) => {
  const Contact = sequelize.define(
    'contact',
    {
      contact_id: {
        type: Sequelize.BIGINT,  
        primaryKey: true,
        autoIncrement: true,
        field: 'contact_id'
      },
      first_name: {
        type: Sequelize.STRING,
        field: 'first_name'
      },
      last_name: {
        type: Sequelize.STRING,
        field: 'last_name',
      },
      created_at: {
        type: Sequelize.DATE,
        field: 'created_at'
      },
      updated_at: {
        type: Sequelize.DATE,
        field: 'updated_at'   
      }
    },
    {
      tableName: 'contacts',
      freezeTableName: true,
    }
  );

  Contact.associate = (models) => {
    Contact.belongsTo(models.contact_phone, {foreignKey: 'contact_id', as: 'contact'});
    Contact.hasOne(models.phone, {foreignKey: 'phone_id', through: models.contact_phone});
  };

  return Contact;
};

module.exports = (sequelize) => {
  const ContactPhone = sequelize.define(
    'contact_phone',
    {
      contact_id: {
        type: Sequelize.BIGINT,
        references: {
          model: 'contact',
          key: 'contact_id'
        }
      },
      phone_id: {
        type: Sequelize.STRING,
        references: {
          model: 'phone',
          key: 'phone_id'
        }
      }
    }
  );

  ContactPhone.associate = (models) => {
    ContactPhone.belongsTo(models.phone, {foreignKey: 'phone_id', as: 'phone'});
    ContactPhone.belongsTo(models.contact, {foreignKey: 'contact_id', as: 'contact'});
  };

  return ContactPhone;
};

module.exports = (sequelize) => {
  const Phone = sequelize.define(
    'phone',
    {
      phone_id: {
        type: Sequelize.STRING,
        primaryKey: true,
        field: 'phone_id'
      },
      updated_at: {
        type: Sequelize.DATE,
        field: 'updated_at'        
      },
      created_at: {
        type: Sequelize.DATE,
        field: 'created_at'
      }
    },
    {
      tableName: 'phones',
      freezeTableName: true,
    }
  );

  Phone.associate = (models) => {
    Phone.belongsTo(models.contact, {foreignKey: 'phone_id', through: models.contact_phone});
  };

  return Phone;
};

标签: javascriptnode.jspostgresqlsequelize.js

解决方案


你可以这样做。您没有包含额外的contact_phone,您可以像这样直接使用联系人和电话进行关联。

联系模块:

module.exports = (sequelize) => {
    const Contact = sequelize.define(
        'contact',
        {
            contact_id: {
                type: Sequelize.INT,
                primaryKey: true,
                autoIncrement: true,
                field: 'contact_id'
            },
            first_name: {
                type: Sequelize.STRING,
                field: 'first_name'
            },
            last_name: {
                type: Sequelize.STRING,
                field: 'last_name',
            },
            created_at: {
                type: Sequelize.DATE,
                field: 'created_at'
            },
            updated_at: {
                type: Sequelize.DATE,
                field: 'updated_at'
            }
        },
        {
            tableName: 'contacts',
            freezeTableName: true,
        }
    );

    Contact.associate = (models) => {
        Contact.hasOne(models.phone, { // has many or hasOne relationship .here read like contact has one phone 
            foreignKey: 'phone_id',
            onDelete: "CASCADE"
        });
    };

    return Contact;
};

电话模块:

module.exports = (sequelize) => {
    const Phone = sequelize.define(
        'phone',
        {
            phone_id: {
                type: Sequelize.INT,
                primaryKey: true,
                autoIncrement: true,
                field: 'phone_id'
            },
            contact_id: {
                type: Sequelize.INT,
            },
            updated_at: {
                type: Sequelize.DATE,
                field: 'updated_at'
            },
            created_at: {
                type: Sequelize.DATE,
                field: 'created_at'
            }
        },
        {
            tableName: 'phones',
            freezeTableName: true,
        }
    );

    Phone.associate = (models) => {
        Phone.belongsTo(models.contact, {
            foreignKey: 'contact_id',
            as: 'contact',
            onDelete: "CASCADE"
        });
    };
}

您的查询如下:

models.contact.findAll({
    include: [
        {
            model: models.phone,
            as: 'contact'
        }
    ]
}).then(contacts => {
    res.status(200).send(contacts);
});

编辑 :

如何定义更多与相同键和不同别名的关联

Phone.associate = (models) => {
    Phone.belongsTo(models.contact, {
        foreignKey: 'contact_id',
        as: 'contact',
        onDelete: "CASCADE"
    });
    Phone.belongsTo(models.contact, {
        foreignKey: 'contact_id',
        as: 'phone',
        onDelete: "CASCADE"
    });
};

推荐阅读