微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决序列化:限制和订购热切关联

我有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
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。