使用 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 子句的主要内容,如果未能解决你的问题,请参考以下文章

在子数组上使用“where”和“in”时出现续集错误

在子查询中续集“WHERE”子句

sequelize 嵌套包含 where 子句

在子查询中为数据透视列的值实现 WHERE 子句?

如何使用包含模型中的属性来创建 where 条件?

在 sequelize 中使用 findByPk 和 WHERE 条件