【问题标题】:Where condition for joined table in Sequelize ORMSequelize ORM中连接表的条件
【发布时间】:2016-07-15 17:54:19
【问题描述】:

我想用 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')

问题是续集不允许我在 where 子句中引用“B”或“C”表。以下代码

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

    }, {
        model: C,
        where: {
            userId: 100
        },
        required: false
    }]
] 

给我

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

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

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

    }, {
        model: C,
        required: false
    }]
] 

甚至不是一个有效的查询:

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')

sequelize 是否可以进行第一次查询,或者我应该坚持原始查询?

【问题讨论】:

  • 非常有用的问题!
  • 更新(Jan Aagaard Meier)的回答,添加subQuery=false 选项以使用限制和偏移

标签: javascript sql postgresql orm sequelize.js


【解决方案1】:

将引用连接表的列包装在$$

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

    }, {
        model: C,
        required: false
    }]
}); 

【讨论】:

  • 如果我添加另一个包含,即{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 ' OR "A"."C.userId" = '100') ) 作为 "A" 左外连接 "B" ON "A"."bId" = "B"."id" 左外连接 "C" ON "A"."cId" = "C"."id" 有什么建议可以解决这个问题吗?
  • 这个 $$ 语法是否记录在某处?
  • @xb1itz 运气好可以通过第二次加入解决问题吗?我也遇到了这个问题。
  • 在此处记录:docs.sequelizejs.com/manual/tutorial/… 在“热加载模型的顶层”下
  • 按原样工作,但如果我尝试添加 limit 则会中断。
【解决方案2】:

在包含中添加 where 条件以及连接。

    {
       model: C,
       where: {
        id: 1
       }
   }

【讨论】:

  • 如果您想将required: true用作“AND”过滤器,请务必在此处添加required: true
猜你喜欢
  • 2022-01-18
  • 2020-03-08
  • 2015-07-05
  • 2019-10-03
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多