序列化:限制和订购热切关联

问题描述

我有4张桌子。用户,房间,消息和联接表RoomUsers。

I want to write a query that:
 1. Return a list of rooms
 2. Each room with the last message sent
 3. Rooms ordered by the message last sent

问题是,我无法同时限制嵌套加载的关联关联顺序。

Users.hasMany(Messages) / Message.belongsTo(Users)
Rooms.hasMany(Messages) / Message.belongsTo(Rooms)

RoomUser.belongsTo(Users) / Users.belongsToMany(Rooms,{through: RoomUsers})
RoomUser.belongsTo(Rooms) / Rooms.belongsToMany(Users,{through: RoomUsers})

不确定是否会有所作为,但是我正在使用迁移与Sequelize的编码关联(也称为User.hasMany(Messages)

我的模型/迁移代码可在以下位置找到:https://github.com/Derrick-Mei/nodeChat/tree/master/database(请注意,在下面的示例中,为便于阅读,我进行了一些大小写更改)

我尝试过的事情

查询“房间”表

await Room.findAll({
  include: [
    {
      model: Message,limit: 1,// YOU CAN LIMIT
      include: [
        {
          model: User,},],order: [["messages","id","DESC"]],// OR YOU CAN ORDER,BUT NOT BOTH
});

当我尝试限制嵌套关联(消息),并按最后一条消息对房间进行排序时,出现错误:

Executing (default): SELECT "room"."id","room"."name" FROM "rooms" AS "room" ORDER BY "messages"."id" DESC;
(node:23360) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: missing FROM-clause entry for table "messages"

我尝试了各种属性,例如subQuery: falsethrough: {}required: true。到目前为止,一切都没有。

尝试查询联接表会导致相同的限制。

解决方法

我认为您需要使用Sequelize.literal()。使用此工具,我们可以轻松访问messages.id并获得结果。

return await Room.findAll({ 
include: [
    {
      model: Message,offset:0,limit: 1,// YOU CAN LIMIT
      include: [
        {
          model: User,},],order: [[Sequelize.literal(`messages.id`),`DESC`]],subQuery:false
});

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...