2016-03-28 59 views
13

我想這樣的查詢與sequ​​elize ORM:凡在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') 

的問題是,sequelise不是讓我來引用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') 

是第一查詢甚至可能與sequ​​eliz e,還是我應該堅持原始查詢? `:

回答

23

裹在$$

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

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

如果我再添包括這一切都無法作爲參考連接表,即'{真正需要}列。然後sequelize使用INNER JOIN在子查詢中放入WHERE子句。因此會生成無效的查詢。 SELECT 「A」。*, FROM(SELECT * 從 「A」 INNER JOIN 「d」 ON 「A」。 「DID」= 「d」, 「ID」 WHERE( 「A」。「B .userId「='100' 或」A「。」C.userId「='100') )as」A「 LEFT OUTER JOIN」B「ON」A「。」bId「=」B「。」 ID「 LEFT OUTER JOIN」C「ON」A「。」cId「=」C「。」id「 如何解決這個問題? – xb1itz

+11

這個$$語法記錄在某處嗎? –

+0

超級實用的功能,沒有在文檔上找到它 – renatoargh