Как я могу рассчитывать внутри вложенных ассоциаций в Sequelize? - PullRequest
1 голос
/ 25 февраля 2020

Я стараюсь считать отзывы о товарах во вложенных ассоциациях. С помощью следующего запроса.

const user = await User.findOne({
  where: {
    id: req.query.user
  },
  attributes: ["id", "name"],
  include: [
    {
      model: Category,
      as: "interests",
      attributes: ["category_name"],
      through: {
        attributes: []
      },
      include: [
        {
          model: Product,
          as: "products",
          attributes: {
            include: [
              [
                // How to count product_reviews here?
                sequelize.literal(`
                (SELECT COUNT(*) FROM product_reviews WHERE productId = Product.id)
                `),
                "num_reviews"
              ]
            ] 
          },
          include: [
            {
              model: User,
              as: "userReviews",
              attributes: []
            }
          ]
        }
      ]
    }
  ]
});

В определениях моделей у меня установлена ​​ассоциация ownTo / haveMany, например:

Внутри моих моделей

// User model
User.belongsToMany(models.Category, {
  through: "user_categories",
  as: "interests",
  foreignKey: "userId"
});
User.belongsToMany(models.Product, {
  through: "user_reviews",
  as: "reviews",
  foreignKey: "userId"
});

// Category model
Category.hasMany(models.Product, {
  foreignKey: "categoryId",
  as: "products"
});

// Product model
Product.belongsToMany(models.User, {
  through: "product_reviews",
  as: "userReviews",
  foreignKey: "productId"
});

// Product_reviews model
product_review.belongsTo(models.User, { foreignKey: "userId" });
product_review.belongsTo(models.Product, { foreignKey: "productId" });

Как считать отзывы о товаре? Вот результат, который я хочу.

{
  "id": 1,
  "name": "John Doe",
  "interests": [
    {
      "category_name": "Toys",
      "products": [
        {
          "id": 1,
          "name": "Lorem Ipsum",
          "num_reviews": 20 // I need to count # of reviews here
        },
        ...
      ]
    }
  ]
}

Может кто-нибудь объяснить, как получить подсчет внутри вложенных, связанных в этом случае?

1 Ответ

0 голосов
/ 25 февраля 2020

Я думаю, вы на правильном пути, и вам просто нужно изменить способ построения литерала Sequelize для подсчета отзывов следующим образом -

sequelize.literal(`
                (SELECT COUNT(*) FROM product_reviews WHERE productId = \`products\`.\`id\`)
                `)

Надеюсь, это поможет!

...