如何在 Sequelize 中按多对多关系排序?

Posted

技术标签:

【中文标题】如何在 Sequelize 中按多对多关系排序?【英文标题】:How to order by many to many relationship in Sequelize? 【发布时间】:2020-06-09 21:28:03 【问题描述】:

我通过 UserCategoryUserCategory 之间建立了多对多关系,如下所示。

let user = await User.findAll(
  where: 
    id: req.query.user
  ,
  attributes: ["id", "name"],
  include: [
    
      model: models.Category,
      as: "interests",
      attributes: ["id", "name", "nameTH", "icon"],
      through: 
        model: models.UserCategory,
        as: "user_categories",
        attributes: ["id", "userId", "categoryId", "updatedAt"]
      
    
  ],
  // Here, I want to order by updatedAt in user_categories
  order: [["user_categories", "updatedAt", "DESC"]] 
);

如何通过 UserCategory 模型中的“updatedAt”对结果进行排序?

【问题讨论】:

你的sequelize版本是什么? "sequelize": "^5.21.3", "sequelize-cli": "^5.5.1" 【参考方案1】:

请参考以下代码以updatedAtUserCategory模型中对结果进行排序-

let user = await User.findAll(
  where: 
    id: req.query.user
  ,
  attributes: ["id", "name"],
  include: [
    
      model: models.Category,
      as: "interests",
      attributes: ["id", "name", "nameTH", "icon"],
      through: 
        model: models.UserCategory,
        as: "user_categories",
        attributes: ["id", "userId", "categoryId", "updatedAt"]
      
    
  ],
  // Here, I want to order by updatedAt in user_categories
  order: [[Sequelize.literal('`interests->user_categories`.`updatedAt`'), 'DESC']] 
);

希望对你有帮助!

【讨论】:

你又救了我一命!谢谢你的时间。 @SohamLawar 太棒了!好电话。 我有这个错误:语法错误(近似位置:\“.\”)(从谷歌翻译)。你能帮我解决这个问题吗? 已解决,在下面回答:)【参考方案2】:

对于有类似错误的那些ошибка синтаксиса (примерное положение: \".\") 要么 syntax error (approximate position: \ ". \")

首先,转到Sequelize.literal()函数

其次,将参数字符串从单引号('')改为双引号("")

然后,只需交换 反引号 ( `` )双引号 ("")

let user = await User.findAll(
  where: 
    id: req.query.user
  ,
  attributes: ["id", "name"],
  include: [
    
      model: models.Category,
      as: "interests",
      attributes: ["id", "name", "nameTH", "icon"],
      through: 
        model: models.UserCategory,
        as: "user_categories",
        attributes: ["id", "userId", "categoryId", "updatedAt"]
      
    
  ],
  // Your changes here
  order: [[Sequelize.literal(`"interests->user_categories"."updatedAt"`), 'DESC']] 
  // order: [[Sequelize.literal('`interests->user_categories`.`updatedAt`'), 'DESC']] 
);

特别感谢@SohamLawar

【讨论】:

感谢您的更新。这可能是 postgresql 的 SQL 语法问题。 这是完美的!

以上是关于如何在 Sequelize 中按多对多关系排序?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy按多对多关系排序

如何查询多对多关系sequelize?

Django:按多对多字段订购模型

在 Sequelize.js 中为多对多关系添加默认角色

Sequelize 查询在多对多关系中显示附加数据

Sequelize 多对多关系同一张表