Sequelize 列引用不明确

问题描述 投票:0回答:1

我正在尝试完成连接所有关联模型的任务,然后检索所有模型的计数 我希望数据返回为

product {
   main_dish: {},
   side_dish: {},
   drink: {},
   purchase_product_count: x,
   purchased_products: []
}

我在续集中构建了这个来尝试做到这一点。

     await Product.findAll({
        include: [{
            model: MainCourse,
            required: false,
        }, {
            model: SideDish,
            required: false,
        }, {
            model: Drink,
            required: false,
        }, {
            model: ProductPurchase,
            required: false,
            where: {
                createdAt: {[Op.between]: [two_days_before, current_date]}
            },
        }],
        attributes: {
            include: ['*', 
                [Sequelize.literal(
                    "(SELECT COUNT(*) from product_purchases as p where p.purchase_product_id = products.product_id)"), "product_purchase_count"],
            ]
        },
        offset: 1 * 5,
        limit: 5
    })
    .then((results) => {
        console.log(results)
        res.status(200).json(results)
    })
    .catch((err) => {
        console.log(err)
        res.status(400).json(err)
    })

尝试运行此急切加载会出现此错误

column reference "product_id" is ambiguous

这是sequelize生成的sql

SELECT "products".*, "main_course"."main_course_id" AS "main_course.main_course_id", "main_course"."type" AS "main_course.type", "main_course"."createdAt" AS "main_course.createdAt", "main_course"."updatedAt" AS "main_course.updatedAt", "main_course"."deletedAt" AS "main_course.deletedAt", "main_course"."main_product_id" AS "main_course.main_product_id", "side_dish"."side_dish_id" AS "side_dish.side_dish_id", "side_dish"."type" AS "side_dish.type", "side_dish"."createdAt" AS "side_dish.createdAt", "side_dish"."updatedAt" AS "side_dish.updatedAt", "side_dish"."deletedAt" AS "side_dish.deletedAt", "side_dish"."side_product_id" AS "side_dish.side_product_id", "drink"."drink_id" AS "drink.drink_id", "drink"."type" AS "drink.type", "drink"."createdAt" AS "drink.createdAt", "drink"."updatedAt" AS "drink.updatedAt", "drink"."deletedAt" AS "drink.deletedAt", "drink"."drink_product_id" AS "drink.drink_product_id", "product_purchases"."product_purchase_id" AS "product_purchases.product_purchase_id", "product_purchases"."price" AS "product_purchases.price", "product_purchases"."quantity" AS "product_purchases.quantity", "product_purchases"."createdAt" AS "product_purchases.createdAt", "product_purchases"."updatedAt" AS "product_purchases.updatedAt", "product_purchases"."deletedAt" AS "product_purchases.deletedAt", "product_purchases"."purchase_product_id" AS "product_purchases.purchase_product_id", "product_purchases"."restaurant_order_id" AS "product_purchases.restaurant_order_id" FROM (SELECT "products"."product_id", "products"."title", "products"."price", "products"."createdAt", "products"."updatedAt", "products"."deletedAt", "products"."restaurant_id", "products".*, (SELECT COUNT(*) from product_purchases as p where p.purchase_product_id = products.product_id) AS "product_purchase_count" FROM "products" AS "products" WHERE ("products"."deletedAt" IS NULL) LIMIT 5 OFFSET 5) AS "products" LEFT OUTER JOIN "main_courses" AS "main_course" ON "products"."product_id" = "main_course"."main_product_id" AND ("main_course"."deletedAt" IS NULL) LEFT OUTER JOIN "side_dishes" AS "side_dish" ON "products"."product_id" = "side_dish"."side_product_id" AND ("side_dish"."deletedAt" IS NULL) LEFT OUTER JOIN "drinks" AS "drink" ON "products"."product_id" = "drink"."drink_product_id" AND ("drink"."deletedAt" IS NULL) LEFT OUTER JOIN "product_purchases" AS "product_purchases" ON "products"."product_id" = "product_purchases"."purchase_product_id" AND ("product_purchases"."deletedAt" IS NULL AND "product_purchases"."createdAt" BETWEEN '2022-05-06 08:35:12.577 +00:00' AND '2022-05-08 08:35:12.577 +00:00');

根据 pgadmin 的说法,问题是在 main_courses 上进行连接时开始的

ERROR:  column reference "product_id" is ambiguous
LINE 1: ...EFT OUTER JOIN "main_courses" AS "main_course" ON "products"...

我似乎不明白sequelize join是如何工作的,因为我使用的是没有任何列相同的ORM方法。外键与“product_id”都不同。 Product_id 是否可能被创建并再次加入聚合?为什么我会收到此错误,以及如何实现获取 Product_purchases 计数以及购买产品的连接数组的结果。

显然,我可以获取purchased_products.length,然后将其添加到对象本身,但我试图弄清楚是否可以通过sequelize来做到这一点,而不必破解它。

node.js sequelize.js
1个回答
0
投票

两个表具有相同的列名?:

指定查询首选的

Table.columnName

请参阅下面的示例查询:

//this is typescript, using Sequelize.
const result = await Table.findAll({ where: { 
 [Op.and]:[
  {
          Sequelize.where(
      Sequelize.cast(Sequelize.col("PreferredTable.columnName"), "TEXT"),
      {
        [Op.like]: `%${columnName}%`,
      }
    )

  }
 ]
} });

注意将

columnName
转换为 TEXT 的偏好,使用您自己的首选设置,但方法基本相同。

© www.soinside.com 2019 - 2024. All rights reserved.