使用 sequelize 包含列的 where 子句
Posted
技术标签:
【中文标题】使用 sequelize 包含列的 where 子句【英文标题】:where clause on include column using sequilize 【发布时间】:2015-11-10 22:04:30 【问题描述】:我正在使用这个查询:
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']
)
这给了我正确的结果,问题是因为它和左连接的 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
我希望查询具有左连接和这样的 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
但我尝试的所有操作都将“Spectrum”放在它前面,然后找不到该行。这应该怎么做?还是我只需要使用原始查询?
【问题讨论】:
【参考方案1】: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']
);
(我删除了一些语句以专注于重要部分)
【讨论】:
感谢您让我知道这个功能!当我尝试实现这一点时,它给了我WHERE `Varietals`.`Wines`.`restaurant_id` = 16
这给了我“未知列”错误,因为它看起来要么需要阅读WHERE `Varietals.Wines`.`restaurant_id` = 16
吗?
啊,你是对的,如果你确实需要在外面的位置,这实际上可能很难解决。【参考方案2】:
包含数组
include = [
model: db.caregiverCategory,
as: 'categories',
attributes: ['name'],
required: true,
attributes: ['name'],
include: [
model: db.category,
as: 'category',
required: true
]
]
Where 子句
where[Op.or] = [
'$categories.name$': [Op.like]: '%' + query.category_name + '%'
,
'$categories.category.name$': [Op.like]: '%' + query.category_name + '%'
]
您需要在属性中添加所有字段,例如名称(在 or 中是必需的):['name'] 否则会给出未知列错误。
【讨论】:
以上是关于使用 sequelize 包含列的 where 子句的主要内容,如果未能解决你的问题,请参考以下文章