首页 > 解决方案 > Sequelize 请求未正确排序记录

问题描述

我正在使用以下 Sequelize 请求通过预订 ID 获取车辆预订。包括链接的车辆及其照片。

Bookings.findAll({
    where: {
        id: bookingid,
    },
    include: [
        {
            model: db.vehicles,
            include: {
                model: db.photos,
                order: [["photoOrder", "ASC"]],
            },
        },
    ],
})

它的工作原理是我得到了正确的数据,但照片不是按 photoOrder 升序排列的。

[
    {
        "id": 1,
        "bookingCost": 123,
        "userId": 1,
        "vehicleId": 1,
        "vehicle": {
            "id": 1,
            "model": "fiesta",
            "photos": [
                {
                    "id": 2,
                    "photoOrder": 2,
                    "photoUrl": "https://xxx.jpg",
                    "vehicleId": 1
                },
                {
                    "id": 1,
                    "photoOrder": 1,
                    "photoUrl": "https://yyy.jpg",
                    "vehicleId": 1
                }
            ]
        }
    }
]

我究竟做错了什么?我的协会是:

db.vehicles.hasMany(db.bookings);
db.bookings.belongsTo(db.vehicles);

db.vehicles.hasMany(db.photos);
db.photos.belongsTo(db.vehicles);

标签: sequelize.js

解决方案


order选项适用于顶层。

你可以做

Bookings.findAll({
  where: ...,
  include: ...,
  order: [[db.vehicles, db.photos, "photoOrder", "ASC"]]
})

================================

更新:

order选项可以申请include。但是,要生效,您需要添加separate: true.

Bookings.findAll({
  where: ...,
  include: {
    model: db.vehicles,
    include: {
      model: db.photos,
      separate: true,
      order: [["photoOrder", "ASC"]]
    }
  }
})

separate: true将执行 2 个查询。

order放入顶层的原始答案将执行1个查询。

如果数据很小,我认为任何一个选项都可以,所以这只是一个偏好。


推荐阅读