mysql 在where inside include中引用父列

6pp0gazn  于 2023-06-28  发布在  Mysql
关注(0)|答案(1)|浏览(87)

基本上我有三个表:评论、类别和标签。标签与类别和评论相关联。当我获取评论时,我还可以获取与这些评论相关联的类别以及与这些类别相关联的标签。问题是这些标签可以与多个类别相关联,而这些类别又可以与多个评论相关联,因此,例如,我们有一个与类别C1相关联的评论R1,以及与C1相关联的标签T1和T2。如果我有另一个与类别T3和T4相关联的Review R2,当我获取Review R1时,它也将获取类别C1沿着标签T1、T2、T3和T4。
我的解决方案是检查reviewId是否与Review.id关联表中where子句中的www.example.com相同。所以基本上:

let options = {
            include: [
                {
                    model: Categories,
                    as: "categories",
                    attributes: ["id", "name"],
                    through: {
                        attributes: []
                    },
                    include: [
                        {
                            model: Tags,
                            as: "tags",
                            attributes: ["id", "name"],
                            through: {
                                attributes: [],
                                where: {
                                    reviewId: "HERE"
                                }
                            },
                        },
                    ],
                },
            ],
            order: [["updatedAt", "DESC"]]
        };

在Tags/through中的“where”语句中,我需要引用父模型(Review)id,但是如果我调用,例如,col(“Reviews.id“)sequelize,就会说属性不存在。

relj7zay

relj7zay1#

显然,在这里发布问题是魅力所在,所以我将分享解决方案:
我没有查询Categories.Tags.ReviewTags中的select,而是将where子句移到了顶部,并使用这里描述的语法对嵌套对象使用顶级where。生成的查询生成器对象为:

let options = {
  include: [
    {
      model: Categories,
      as: "categories",
      attributes: ["id", "name"],
      through: {
        attributes: []
      },
      include: [
        {
          model: Tags,
          as: "tags",
          attributes: ["id", "name"],
          through: {
            attributes: []
          },
        },
      ],
    },
  ],
  where: {
    "$categories.tags.ReviewTags.reviewId$": { [Op.col]: "Reviews.id" }
  },
  order: [["updatedAt", "DESC"]]
};

相关问题