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

标签 express ionic-framework sequelize.js

我正在使用 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/

    相关文章:

    javascript - 用户定义但 user.user_id 未定义

    javascript - expressjs路由器不工作

    javascript - ionic 框架 : Can't redirect to another page from my controller?

    javascript - 为什么Sequelize将 'media'复数为medium

    node.js - Sequelize中如何实现主动MVC模型

    mysql - Sequelize Eager Loading 两个相同的 N :M models one returns data other does not

    javascript - NodeJS Express 要求和启动

    node.js - 如何在 Mongoose 中创建复合唯一的自动增量字段?

    html - Ionic 在 ionic View 中将标题和顶部导航栏放在哪里?

    javascript - 如何使用 Ionic 中的 Canvas 绘制照片,然后在照片顶部绘制形状?