【问题标题】:Sequelize: column name to lowercase not working with included modelsSequelize:列名小写不适用于包含的模型
【发布时间】:2026-02-05 02:45:01
【问题描述】:

我有两个模型:类别和书签。书签通过 categoryId 列与类别关联。

类别也有namecreatedAtorderId列;


我可以通过以下方式获取类别及其所有书签:

const category = await Category.findOne({
    where: { id: req.params.id },
    include: [
      {
        model: Bookmark,
        as: 'bookmarks'
      },
    ]
  });

但现在我想更改书签的排序方式。订单类型可以是namecreatedAtorderId

const order = orderType == 'name'
  ? [[
      { model: Bookmark, as: 'bookmarks' },
      Sequelize.fn('lower', Sequelize.col('bookmarks.name')),
      'ASC'
    ]]
  : [[{ model: Bookmark, as: 'bookmarks' }, orderType, 'ASC']]

const category = await Category.findOne({
    where: { id: req.params.id },
    include: [
      {
        model: Bookmark,
        as: 'bookmarks'
      },
    ],
    order
  });

orderType 为createdAtorderId 时工作正常,但在name 时失败


我收到此错误:SQLITE_ERROR: near \"(\": syntax error 和 Sequelize 生成的 SQL 查询是:

SELECT `Category`.`id`, `Category`.`name`, `bookmarks`.`id` AS `bookmarks.id`, `bookmarks`.`name` AS `bookmarks.name`, `bookmarks`.`categoryId` AS `bookmarks.categoryId`, `bookmarks`.`orderId` AS `bookmarks.orderId`, `bookmarks`.`createdAt` AS `bookmarks.createdAt`
FROM `categories` AS `Category`
INNER JOIN `bookmarks` AS `bookmarks` ON `Category`.`id` = `bookmarks`.`categoryId`
ORDER BY `bookmarks`.lower(`bookmarks`.`name`) ASC;

【问题讨论】:

    标签: javascript sql sqlite sequelize.js


    【解决方案1】:

    改成:

    const order =
        orderType == 'name'
          ? [[Sequelize.fn('lower', Sequelize.col('bookmarks.name')), 'ASC']]
          : [[{ model: Bookmark, as: 'bookmarks' }, orderType, 'ASC']];
    

    现在它正在工作。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    最近更新 更多