Sequelize:获取Subquery / Raw Query作为include的模型

时间:2017-12-04 07:51:41

标签: node.js sequelize.js

我已经阅读了Sequelize文档,但找不到任何有用的内容

我想要做的是在include中添加原始查询或自定义模型,是否可能?

model.Post.findAll({
            include: [{
                    model: model.User,
                    attributes: ['fullname', 'profilepic'],
                },
                {
                    model: model.PostComments,
                },
                {
                    model: "Raw Query"
                }
            ]
        }

我想要实现的目标是:

Select post_id, count(*) as total_likes from post_likes group by post_id

我无法通过简单地使用include来实现这一点,所以我想要做的是从上面的查询中创建一个表/模型,然后在include中使用它。

如果我在使用include时使用分组,则会从顶级提供分组​​,并且我只想将group应用于post_like表。

如果发现令人困惑或不清楚,请告诉我。

2 个答案:

答案 0 :(得分:0)

您可以使用

Model.findAll({
  attributes: [[models.sequelize.literal('CASE WHEN "field1" = true THEN 55 
    ELSE 23 END'), 'field3']]
}

Model.findAll({
  attributes: { include: [[models.sequelize.literal('CASE WHEN "field1" = true THEN 55 ELSE 23 END'), 'field3']]}
}

答案 1 :(得分:0)

我一直想做同样的事情,使用在 include 内部动态形成的原始查询,但是没有这种方法就不可能使用 include 模型https://sequelize.org/master/class/lib/model.js~Model.html#static-method-findAll

出于MySQL的目的,我将内部联接(包括)转换为所在位置。我正在进行内部联接,以避免出现This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery异常。我收到此异常是因为我有一个应用了LIMIT的子查询。

如果它可以帮助任何人:

let rows = await j_model.findAll({
        attributes: [...j_columns, `${association}.meta_key_id`],
        include: [
            {
                model: um_model,
                as: association,
                attributes: ['um_id'],
                on: {'j_id' : {$col: 'j.j_id'} }
        ],
        where: {'j_id': {$in: sequelize.literal(`(SELECT * FROM (${massive_inner_raw_query}) as tmp)`)}},
        logging: console.log
    });

实际魔术在这一行:

where: {'j_id': {$in: sequelize.literal(`(SELECT * FROM (${massive_inner_raw_query}) as tmp)`)}}

SELECT * FROM 删除了该异常,让我可以在 where 中进行操作,而不是想要的 INNER JOIN 。也许您可以对您的问题进行类似的处理。