提问者:小点点

SequeLizeEagerLoadingError:产品未与集合关联


我在MySQL中使用sequelize ORM。 我有三个模型:产品,集合,集合

产品和集合之间的关系是多对多的,在sequelize中为了处理这个关系,我使用了BongaryStomany关联。 一切正常,但当我运行这段代码以获取一个集合及其产品,包含Eager时,出现了错误occure:

SequeLizeEagerLoadingError:产品未与集合关联!

产品型号:

module.exports = (sequelize, Sequelize) => {
const Product = sequelize.define('product', {
id: {
  allowNull: false,
  autoIncrement: true,
  primaryKey: true,
  type: Sequelize.INTEGER,
},
name_en: {
  type: Sequelize.STRING(255),
},
description_en: {
  type: Sequelize.STRING(1024),
},
price: {
  type: Sequelize.FLOAT,
  allowNull: false,
},
type: {
  type: Sequelize.STRING(255),
},
height: {
  type: Sequelize.INTEGER,
},
width: {
  type: Sequelize.INTEGER,
},
createdAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
updatedAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
}, {})

Product.associate = (models) => {
Product.belongsToMany(models.collection, { through: models.collectionProduct, as: 'collections', foreignKey: 'productId' })
}

return Product
}

集合模型:

module.exports = (sequelize, Sequelize) => {
const Collection = sequelize.define(
'collection', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    allowNull: false,
    autoIncrement: true,
  },
  name_en: {
    type: Sequelize.STRING(255),
  },
  itemsCount: {
    type: Sequelize.INTEGER,
  },
  createdAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    allowNull: false,
  },
  updatedAt: {
    type: Sequelize.DATE,
    defaultValue: Sequelize.NOW,
    allowNull: false,
  },
}, {},
)
Collection.associate = (models) => {
Collection.belongsToMany(models.product, { through: models.collectionProduct, as: 'products', foreignKey: 'collectionId' })
}
return Collection
}

集合产品模型:

module.exports = (sequelize, Sequelize) => {
const CollectionProduct = sequelize.define('collectionProduct', {
collectionId: {
  type: Sequelize.INTEGER,
},
productId: {
  type: Sequelize.INTEGER,
},
createdAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
updatedAt: {
  type: Sequelize.DATE,
  defaultValue: Sequelize.NOW,
  allowNull: false,
},
}, {})

CollectionProduct.associate = (models) => {}


return CollectionProduct
}

routes/collection.js

const express = require('express')

const router = express.Router()

const Collection = require('../../controllers/collectionController')

router.get('/:id', async (req, res) => {
 const { id: collectionId } = req.params
 const collection = await Collection.getOne(collectionId)
 return collection
}

CollectionController

const db = require('../models/index')

const Collection = db.collection
const Product = db.product

const getOne = async (collectionId) => {
   const collection = await Collection.findByPk(collectionId, {
      include: {
      model: Product,
      as: 'products',
      attributes: ['id', 'name_en'],
   },
  })
return collection
}

共1个答案

匿名用户

我找到我的问题了。 在collectionController中,我使用了Model:Product,Product应该是一个Sequeize模型。 但在我的代码中,这是一个在models/index中调用的函数。 所以我改变了我的调用并传递了一个Sequeize模型给getOne