使用 Sequilize 包含列的 where 子句

Ash*_*ett 3 orm node.js sequelize.js

我正在使用这个查询:

db.Spectrum.findAll({
        attributes: ['title', [db.Sequelize.fn('SUM', db.Sequelize.col('quantity') ), 'count']],
        include: [
            {model: db.Varietal,
             attributes : ['specID', 'id'],
                include : [
                    { model : db.Wine,
                      required: false,
                      attributes : ['varietal_id', 'id'], 
                      where : {restaurant_id : restaurant_id,
                                owner_id : null} }
                ],
            }
        ],
        group : ['specID']
    })
Run Code Online (Sandbox Code Playgroud)

这给了我正确的结果,问题是因为它和左连接的 where 子句运行得非常慢(大约 2 秒)。

左连接的原始查询如下所示。

LEFT OUTER JOIN `wines` AS `Varietals.Wines` ON `Varietals`.`id` = `Varietals.Wines`.`varietal_id` AND `Varietals.Wines`.`restaurant_id` = 16 AND `Varietals.Wines`.`owner_id` IS NULL 
Run Code Online (Sandbox Code Playgroud)

我希望查询具有左连接和像这样的 where 子句。

LEFT OUTER JOIN `wines` AS `Varietals.Wines` ON `Varietals`.`id` = `Varietals.Wines`.`varietal_id`
WHERE `Varietals.Wines`.`restaurant_id` = 16 AND `Varietals.Wines`.`owner_id` IS NULL 
Run Code Online (Sandbox Code Playgroud)

但我尝试的所有操作都将“Spectrum”放在它前面,然后找不到该行。这应该如何完成?或者我必须只使用原始查询?

Mic*_*sen 7

include.where总是将条件添加到连接中。然而,在 Sequelize 中v3.13.0添加了对特殊嵌套键的支持。

现在可以将 where 对象添加到包含用 $ 包裹的点分隔键的顶级对象,以指定它是嵌套字段。

将其应用到您的代码中:

db.Spectrum.findAll({
  include: [
    {
      model: db.Varietal,
      include : [
        {
          model : db.Wine
        }
      ]
    }
  ],
  where: {
    '$Varietals.Wines.restaurant_id$': restaurant_id,
    '$Varietals.Wines.owner_id$': null
  },
  group : ['specID']
});
Run Code Online (Sandbox Code Playgroud)

(我删除了一些陈述以集中重点部分)