gpt4 book ai didi

express - sequelize freezeTableName 但在 sql 查询中仍然是复数表名

转载 作者:行者123 更新时间:2023-12-03 22:28:38 25 4
gpt4 key购买 nike

我正在使用 express+ionic+mysql+sequelize 开发一个应用程序,现在我在sequelize 中出现错误。
我有三张 table ,它们是

  • xx_product
  • xx_product_specification_value
  • xx_specification_value

  • 它们之间的关系如下:
    xx_product                     hasMany     xx_product_specification_value
    xx_specification_value hasMany xx_product_specification_value
    xx_product_specification_value belongsTo xx_product
    xx_product_specification_value belongsTo xx_specification_value

    这是代码:

    模型/products.js
    module.exports = function(sequelize, DataTypes){
    return xx_product = sequelize.define('xx_product', {
    price: {
    type: DataTypes.DECIMAL
    },
    full_name: {
    type: DataTypes.STRING
    },
    name: {
    type: DataTypes.STRING
    },
    image: {
    type: DataTypes.STRING
    },
    introduction: {
    type: DataTypes.TEXT
    },
    xxSupplierId: {
    type: DataTypes.BIGINT,
    field: 'supplier'
    },
    xxBrandId: {
    type: DataTypes.BIGINT,
    field: 'brand'
    }
    },{
    freezeTableName: true,
    tableName: 'xx_product',
    timestamps: false,
    classMethods: {
    associate: function(models) {
    xx_product.belongsTo(models.xx_supplier, {
    foreignKey: 'supplier'
    })
    xx_product.belongsTo(models.xx_brand, {
    foreignKey: 'brand'
    })
    xx_product.hasMany(models.xx_product_specification_value)
    }
    }
    })
    }

    模型/product_specification_value.js
    module.exports = function(sequelize, DataTypes){
    return xx_product_specification_value = sequelize.define('xx_product_specification_value', {
    xxProductId: {
    type: DataTypes.BIGINT,
    field: 'products'
    },
    xxSpecificationValueId: {
    type: DataTypes.BIGINT,
    field: 'specification_values'
    }
    },{
    freezeTableName: true,
    tableName: 'xx_product_specification_value',
    timestamps: false,
    classMethods: {
    associate: function(models) {
    xx_product_specification_value.belongsTo(models.xx_product, {
    foreignKey: 'products'
    })
    xx_product_specification_value.belongsTo(models.xx_specification_value, {
    foreignKey: 'specification_values',
    })
    }
    }
    })
    }

    模型/规范_value.js
    module.exports = function(sequelize, DataTypes){
    return xx_specification_value = sequelize.define('xx_specification_value', {
    name: {
    type: DataTypes.STRING
    },
    image: {
    type: DataTypes.STRING
    },
    xxSpecificationId: {
    type: DataTypes.BIGINT,
    field: 'specification'
    }
    },{
    freezeTableName: true,
    tableName: 'xx_specification_value',
    timestamps: false,
    classMethods: {
    associate: function(models) {
    xx_specification_value.hasMany(models.xx_product_specification_value)
    xx_specification_value.belongsTo(models.xx_specification, {
    foreignKey: 'specification'
    })
    }
    }
    })
    }

    路线/product.js
    var models = require('../models')

    exports.show = function(req, res){
    var id = req.params.id
    models.xx_product.findOne({
    where: {
    id: id,
    },
    include: [
    {
    model: models.xx_product_specification_value,
    include: [
    {
    model: models.xx_specification_value,
    include: [
    {
    model: models.xx_specification
    }
    ]
    }
    ]
    }
    ]
    })
    .then(function(product){
    res.json(product)
    })
    }

    当我在 routes/products.js 中调用 show 进行查询时,在控制台中出现如下错误:
    Unhandled rejection SequelizeDatabaseError: ER_BAD_FIELD_ERROR:  
    Unknown column 'xx_product_specification_values.id' in 'field list'

    控制台中的 sql 查询如下:
    Executing (default): SELECT `xx_product`.`id`, `xx_product`.`price`, 
    `xx_product`.`full_name`, `xx_product`.`name`, `xx_product`.`image`,
    `xx_product`.`introduction`, `xx_product`.`supplier` AS
    `xxSupplierId`, `xx_product`.`brand` AS `xxBrandId`,
    `xx_product`.`supplier`, `xx_product`.`brand`,
    `xx_product_specification_values`.`id` AS
    `xx_product_specification_values.id`,
    `xx_product_specification_values`.`products` AS
    `xx_product_specification_values.xxProductId`,
    `xx_product_specification_values`.`specification_values` AS
    `xx_product_specification_values.xxSpecificationValueId`,
    `xx_product_specification_values`.`products` AS
    `xx_product_specification_values.products`,
    `xx_product_specification_values`.`specification_values` AS
    `xx_product_specification_values.specification_values` FROM
    `xx_product` AS `xx_product` LEFT OUTER JOIN
    `xx_product_specification_value` AS `xx_product_specification_values`
    ON `xx_product`.`id` = `xx_product_specification_values`.`products`
    WHERE `xx_product`.`id` = '1742';

    我的问题是为什么它查询为 xx_product_specification_values 而不是 xx_product_specification_value ,为什么它是复数?我已经设置 freeszeTableName = true 并设置 tableName = xx_product_specification_value

    最佳答案

    我对表之间的关系定义犯了一个大错误,如您所见,xx_product 和 xx_specification_value 之间的关系应该是 many_to_many,所以在 sequelize 中我应该将它们定义如下:

    模型/product.js

    xx_product.belongsToMany(models.xx_specification_value, {
    through: {
    model: models.xx_product_specification_value,
    unique: false
    },
    foreignKey: "products"
    })

    模型/规范_value.js
    xx_specification_value.belongsToMany(models.xx_product, {
    through: {
    model: models.xx_product_specification_value,
    unique: false
    },
    foreignKey: "specification_values"
    })

    关于express - sequelize freezeTableName 但在 sql 查询中仍然是复数表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39461503/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com