Sequelize ORM中连接表的条件

fou*_*shw 26 javascript sql postgresql orm sequelize.js

我希望通过sequelize ORM获得这样的查询:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("B"."userId" = '100'
       OR "C"."userId" = '100')
Run Code Online (Sandbox Code Playgroud)

问题是sequelise不让我在where子句中引用"B"或"C"表.以下代码

A.findAll({
    include: [{
        model: B,
        where: {
            userId: 100
        },
        required: false

    }, {
        model: C,
        where: {
            userId: 100
        },
        required: false
    }]
] 
Run Code Online (Sandbox Code Playgroud)

给我

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id" AND "B"."userId" = 100
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id" AND "C"."userId" = 100
Run Code Online (Sandbox Code Playgroud)

这是完全不同的查询和结果

A.findAll({
    where: {
        $or: [
            {'"B"."userId"' : 100},
            {'"C"."userId"' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
] 
Run Code Online (Sandbox Code Playgroud)

甚至没有有效的查询:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("A"."B.userId" = '100'
       OR "A"."C.userId" = '100')
Run Code Online (Sandbox Code Playgroud)

是第一次查询甚至可能与sequ​​elize,或者我应该坚持原始查询?

Jan*_*ier 45

包含引用连接表的列 $$

A.findAll({
    where: {
        $or: [
            {'$B.userId$' : 100},
            {'$C.userId$' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
}); 
Run Code Online (Sandbox Code Playgroud)

  • 这个$$语法是否记录在某处? (19认同)
  • 如果我添加另一个include,那就是`{required:true}`.然后sequelize使用INNER JOIN创建子查询并将WHERE子句放入其中.因此,生成无效的查询.SELECT"A".*,FROM(SELECT*FROM"A"INNER JOIN"D"ON"A"."dId"="D"."id"WHERE("A"."B.userId"='100 '或'A"."C.userId"='100'))为"A"LEFT OUTER JOIN"B"ON"A"."bId"="B"."id"LEFT OUTER JOIN"C"ON "A"."cId"="C"."id"有任何建议如何解决这个问题? (5认同)
  • 按原样工作,但如果我尝试添加“limit”,则会中断。 (5认同)
  • @ xb1itz第二次加入解决问题的运气好吗?我也遇到了这个问题. (4认同)
  • 在此处记录:http://docs.sequelizejs.com/manual/tutorial/models-usage.html#eager-loading在“加载有急切模型的顶层”下 (3认同)
  • @BradDecker这是更新的文档链接(已移动)https://sequelize.org/master/manual/eager-loading.html#complex-where-clauses-at-the-top-level (2认同)

Jas*_*ngh 12

在 include 中添加 where 条件以及 join。

    {
       model: C,
       where: {
        id: 1
       }
   }
Run Code Online (Sandbox Code Playgroud)

  • 如果您想将其用作“AND”过滤器,请务必在此处添加“required: true” (2认同)