我有双重嵌套的包含/连接表。
我需要使用第二个包含列来过滤第一个包含
最后我想过滤关联表中没有链接项目的用户。
我在 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 的类型。
好吧,事实证明在这种情况下你需要明确设置“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,
},
],
},
],
});
(我还更改了列名称格式)
现在效果很好