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”放在它前面,然后找不到该行。这应该如何完成?或者我必须只使用原始查询?
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)
(我删除了一些陈述以集中重点部分)
| 归档时间: |
|
| 查看次数: |
7267 次 |
| 最近记录: |