【问题标题】:where clause on include column using sequilize使用 sequelize 包含列的 where 子句
【发布时间】: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”放在它前面,然后找不到该行。这应该怎么做?还是我只需要使用原始查询?

【问题讨论】:

    标签: node.js orm sequelize.js


    【解决方案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'] 否则会给出未知列错误。

    【讨论】:

      猜你喜欢
      • 2017-08-27
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多