当我尝试创建提供程序时,sequelize显然试图返回provider_id
字段,但它来自用户表,而不是来自提供程序(请参见sql executed)。
在模型中是通过字段定义关系的,我在其他表中使用了相同的关系,并且工作得很好,我现在不知道为什么这不工作。
我用的是postgres数据库。
引发的错误:
名称:'序列化数据库错误',
父项:错误:列“provider_id”不存在
长度:112,
重要级别:“错误”,
代码:“42703”,
详细信息:未定义,
提示:未定义,
位置:“186”,
内部位置:未定义,
内部查询:未定义,
其中:未定义,
架构:未定义,
表:未定义,
列:未定义,
数据类型:未定义,
约束:未定义,
文件:'解析_关系. c',
行:“3337”,
例程:“错误缺少列”,
SQL:'INSERT INTO“提供者”(“标识”,“建议编号”,“创建时间”,“更新时间”,“公司标识”)VALUES(默认值,$1,$2,$3,$4)RETURNING“标识”,“建议编号”,“创建时间”,“更新时间”,“删除时间”,“提供者标识”,“公司标识”,“建议标识”;',参数:[ '00000000','2022年10月6日17:11:28.621 +00:00','2022年10月6日17:11:28.621 +00:00',1 ] },
原始:错误:列“provider_id”不存在
用户模型:
const { Model, DataTypes } = require('sequelize');
class User extends Model {
static init(sequelize) {
super.init(
{
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
insuranceNumber: {
type: DataTypes.STRING,
allowNull: false,
},
phone: {
type: DataTypes.STRING,
allowNull: false,
},
type: {
type: DataTypes.STRING,
allowNull: false,
},
},
{
scopes: {
noPassword: {
attributes: { exclude: ['password'] },
},
},
sequelize,
paranoid: true,
tableName: 'users',
}
);
}
static associate(models) {
this.hasMany(models.Address, { foreignKey: 'userId', as: 'addresses' });
this.belongsTo(models.Provider, { foreignKey: 'providerId', as: 'provider' });
this.belongsTo(models.Customer, { foreignKey: 'customerId', as: 'customer' });
}
}
module.exports = User;
提供程序模型:
const { Model, DataTypes } = require('sequelize');
class Provider extends Model {
static init(sequelize) {
super.init(
{
adviceNumber: {
type: DataTypes.STRING,
allowNull: false,
},
},
{
sequelize,
paranoid: true,
tableName: 'providers',
underscored: true,
}
);
}
static associate(models) {
this.belongsTo(models.Company, { foreignKey: 'companyId', as: 'companies' });
this.belongsTo(models.Advice, { foreignKey: 'adviceId', as: 'advices' });
this.hasOne(models.User, { foreignKey: 'providerId', as: 'user' });
}
}
module.exports = Provider;
存储功能:
async store(req, res) {
const { name, email, password, insuranceNumber, phone, type } = req.body;
let { provider} = req.body;
const { adviceNumber, companyId, adviceId } = provider;
provider = await Provider.create({ adviceNumber, companyId, adviceId }, { raw: true });
let user = await User.create(
{
name,
email,
password,
insuranceNumber,
phone,
type,
providerId: provider.id ,
},
{ raw: true }
);
return res.json(user);
}
1条答案
按热度按时间jxct1oxe1#
似乎你所写的关系并不符合你的定义
在belongsTo中,foreignKey应该属于来源数据表索引键,因此它应该只来自提供者数据表,您已定义相关,但索引键不在结构描述定义中。