Как включить более одной другой таблицы с помощью Sequelize?

#node.js #postgresql #express #sequelize.js

#node.js #postgresql #экспресс #sequelize.js

Вопрос:

У меня есть следующие таблицы:

 Product:
name: string, description: string, image: string

Brand:
name: string

Category:
name: string
 

У одного продукта может быть только один бренд.
Один продукт может иметь несколько категорий.

Мои ассоциации:

 models/product.js:
Product.associate = function(models) {
    Product.hasOne(models.Brand, {
      foreignKey: "productId",
      as: "brand"
    }),
      Product.hasMany(models.Category, {
        foreignKey: "productId",
        as: "categories"
      });
  }
 
 models/category.js:
Category.belongsTo(models.Product, {
      foreignKey: "productId",
      onDelete: "CASCADE"
    })
 
 models/brand.js:
Brand.belongsTo(models.Product, {
      foreignKey: "productId",
      onDelete: "CASCADE"
    })
 

1 — пока все в порядке? Отступ в models/product.js мне это кажется странным.

2- в контроллере my Products как мне получить как бренд, так и категории моих продуктов? В настоящее время у меня есть:

 controllers/products.js:
list(req, res) {
    return Product.findAll({
      include: [
        {
          model: Category,
          as: "categories"
        }
      ]
    })
      .then(products => res.status(200).send(products))
      .catch(error => res.status(400).send(error));
  }
 

Категории включены, как мне также включить бренд?

Я ожидаю, что результатом будет массив продуктов, каждый из которых содержит бренд и одну или несколько категорий.

Ответ №1:

Учитывая установленные ассоциации, вы должны иметь возможность добавить другую модель, разделенную запятыми, например:

 controllers/products.js:
list(req, res) {
    return Product.findAll({
      include: [
        {
          model: Category,
          as: "categories"
        },
        {
          model: Brand,
          as: "brand"
        }
      ]
    })
      .then(products => res.status(200).send(products))
      .catch(error => res.status(400).send(error));
  }