Sequelize - 排序和排除

Sequelize - order and exclude

我有一个 table 项目带有两个 table 的外键,我尝试使用顺序、限制、排除和包含来执行 FindAll,如下所示:

Items.findAll({
    order: [['creationDate', 'DESC']],
    limit: 10,
    include: [
        {
            model: Artists,
            required: false,
            attributes: ['id', 'name',]
        },
        {
            model: Albums,
            required: false,
        },
    ],
    attributes: { exclude: ['creationDate'] }
})

但是我得到一个错误:

DatabaseError [SequelizeDatabaseError]: (conn = 837, no: 1054, SQLState: 42S22) Unknown column 'Items.creationDate' in 'order clause'

如果我删除这一行:

    attributes: { exclude: ['creationDate'] }

错误消失。

我应该怎么做才能启用具有所需属性的查询?

提前致谢

findAllinclude 尝试合并来自多个表的数据。在 SQL 中,Subqueries 和 JOIN 都实现了这个用例。但是,数据的组合方式与您在此处看到的内容略有不同。默认情况下,Sequelize 为 findAll + includesubQuery 生成子查询 params 是告诉 Sequelize 使用子查询(true)或 JOIN(false)。

有关子查询与 JOIN 的更多信息:https://www.essentialsql.com/what-is-the-difference-between-a-join-and-subquery/#:~:text=Joins%20versus%20Subqueries,tables%20into%20a%20single%20result.&text=Subqueries%20can%20be%20used%20to,for%20use%20in%20a%20query

返回续集,

subQuery: true(默认)

这将生成 SQL 如下所示

SELECT ...
FROM (SELECT ...(attributes except creationDate) FROM `Items` ...)
LEFT OUTER JOIN `Artists` ...
...
ORDER BY `Items`.`creationDate` DESC 
LIMIT 10;

这个 SQL 不起作用,因为首先执行嵌套子查询并且子查询不包括 creationDate 并且当执行 main SQL with ORDER 时,creationDate不存在。

然后如果你关闭子查询。

subQuery: false

这将生成 SQL 如下所示

SELECT ... (Artist's, Album's attributes and Item's attributes except creationDate) 
FROM `Items`
LEFT OUTER JOIN `Artists` ...
...
ORDER BY `Items`.`creationDate` DESC 
LIMIT 10;

这会起作用,因为当执行 ORDER 并且 exclude 发生在顶层时,这不会过滤属性。