Sequelize multitilple COUNT в атрибуте (объединение) - PullRequest
0 голосов
/ 26 января 2019

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

Хорошо работает с Stock-моделью. Я считаю количество отлично. Вот и я хочу то же самое с покупкой модели.

Product.findOne({
        include: [{
            model: User,
            attributes: ["id", "username", "jabber", "email"],
            as: 'creator'
        },
            {
                model: Category,
                as: 'category'
            },
            {
                model: ProductImage,
                as: 'images'
            },
            {
                model: Stock,
                attributes: []
            },
            {
                model: Purchase,
                attributes: [],
            }],
        attributes: {
            exclude: ['fk_creator'],
// THIS IS THE PART WHICH NOT WORKS AS EXPECTED
            include: [[Sequelize.fn("COUNT", Sequelize.col("stocks.fk_product")), "stock_count"],// this works
                [Sequelize.fn("COUNT", Sequelize.col("purchases.fk_product")), "buy_count"]] // this gives just the same as stock_count but should give another number
        },
        where: {id: id},
        group: ['product.id', 'images.id']
    }).then((product) => {
        res.send({status: true, data: product})
    }).catch((err) => {
        next(err)
    });

Это запрос, сгенерированный sequelize:

SELECT `product`.`id`, 
       `product`.`title`, 
       `product`.`description`, 
       `product`.`product_type`, 
       `product`.`price`, 
       `product`.`catid`, 
       `product`.`rating`, 
       `product`.`createdat`, 
       `product`.`updatedat`, 
       Count(`stocks`.`fk_product`)    AS `stock_count`, 
       Count(`purchases`.`fk_product`) AS `buy_count`, 
       `creator`.`id`                  AS `creator.id`, 
       `creator`.`username`            AS `creator.username`, 
       `creator`.`jabber`              AS `creator.jabber`, 
       `creator`.`email`               AS `creator.email`, 
       `category`.`id`                 AS `category.id`, 
       `category`.`catname`            AS `category.catname`, 
       `category`.`icon`               AS `category.icon`, 
       `category`.`createdat`          AS `category.createdAt`, 
       `category`.`updatedat`          AS `category.updatedAt`, 
       `images`.`id`                   AS `images.id`, 
       `images`.`fk_product`           AS `images.fk_product`, 
       `images`.`imageurl`             AS `images.imageurl`, 
       `images`.`is_first`             AS `images.is_first`, 
       `images`.`createdat`            AS `images.createdAt`, 
       `images`.`updatedat`            AS `images.updatedAt` 
FROM   `products` AS `product` 
       LEFT OUTER JOIN `users` AS `creator` 
                    ON `product`.`fk_creator` = `creator`.`id` 
       LEFT OUTER JOIN `categories` AS `category` 
                    ON `product`.`catid` = `category`.`id` 
       LEFT OUTER JOIN `product_images` AS `images` 
                    ON `product`.`id` = `images`.`fk_product` 
       LEFT OUTER JOIN `stocks` AS `stocks` 
                    ON `product`.`id` = `stocks`.`fk_product` 
       LEFT OUTER JOIN `purchases` AS `purchases` 
                    ON `product`.`id` = `purchases`.`fk_product` 
WHERE  `product`.`id` = '1' 
GROUP  BY `product`.`id`, 
          `images`.`id`; 

Итак, я получаю число, но оно всегда совпадает с stock_count.

...