Sequelize DatabaseError“缺少表的 FROM 子句条目”过滤嵌套包含/连接

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

我有双重嵌套的包含/连接表。

我需要使用第二个包含列来过滤第一个包含

最后我想过滤关联表中没有链接项目的用户。

我在 Nest.js 中使用 Sequelize 和 PostgreSQL

users.findAll({
  raw: true,
  nest: true,
  where: {} //something
  include: [
    {
      model: OneTimeUrlModel,
      required: false,
      where: {
        '$sent_msgs.id$': { [Op.ne]: null },
      },
      include: [
        {
          model: SentMsgModel,
          attributes: ['id'],
          required: false,
        },
      ],
    },
  ],
});

我得到这个SQL:

SELECT "UserModel"."id", "UserModel"."phone", "urls"."id" AS "urls.id", "urls"."user_id" AS "urls.user_id", "urls->sent_msgs"."id" AS "urls.sent_msgs.id" 
FROM "users" AS "UserModel" 
LEFT OUTER JOIN "urls" AS "urls" ON "UserModel"."id" = "urls"."user_id" AND "sent_msgs"."id" IS NOT NULL 
LEFT OUTER JOIN "sent_msgs" AS "urls->sent_msgs" ON "urls"."id" = "urls->sent_msgs"."url_id";

和一个错误:

error: missing FROM-clause entry for table "sent_msgs"

我该如何进行这项工作?

从这个例子中还不清楚,但我真正想要的是仅过滤“坏”网址并选择没有它们的用户(具有 urls = null 的用户)。 所以我无法将上面的“哪里”移至用户。 我也无法将下面的“where”移动到 sent_msgs,因为过滤也取决于 url 的类型。

sequelize.js sequelize-typescript
1个回答
0
投票

好吧,事实证明在这种情况下你需要明确设置“as”

users.findAll({
  raw: true,
  nest: true,
  where: {} //something
  include: [
    {
      model: OneTimeUrlModel,
      required: false,
      where: {
        '$otu_urls.otu_sent_msgs.id$': { [Op.ne]: null }, //CHANGED THIS
      },
      include: [
        {
          model: SentMsgModel,
          attributes: ['id'],
          as: 'sent_msgs', //ADDED THIS
          required: false,
        },
      ],
    },
  ],
});

(我还更改了列名称格式)

现在效果很好

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