'Sequelize: order before applying imit
My query is sorting the array after the limit has been set, so the array is not sorted properly thus returning wrong data. I want to sort the array by associated object's date attribute, and after that, limit the array and use the offset.
await dbBooking.findAll({
include: [
{
model: dbEvent,
attributes: defaultEventsAttributes,
include: [
{
model: dbUser,
through: { attributes: [] },
attributes: defaultUsersAttributes,
},
],
},
],
order: [['event', 'startTime', 'ASC']],
offset: offset,
limit: 6,
attributes: defaultBookingsAttributes,
});
The SQL Query without subQuery:false
SELECT `booking`.*,
`event`.`id` AS `event.id`,
`event`.`title` AS `event.title`,
`event`.`description` AS `event.description`,
`event`.`starttime` AS `event.startTime`,
`event`.`endtime` AS `event.endTime`,
`event->users`.`id` AS `event.users.id`,
`event->users`.`email` AS `event.users.email`
FROM (SELECT `booking`.`id`,
`booking`.`totalprice`,
`booking`.`eventid`
FROM `bookings` AS `booking`
LIMIT 0, 6) AS `booking`
LEFT OUTER JOIN `events` AS `event`
ON `booking`.`eventid` = `event`.`id`
LEFT OUTER JOIN ( `eventusers` AS `event->users->eventuser`
INNER JOIN `users` AS `event->users`
ON `event->users`.`id` =
`event->users->eventuser`.`userid`)
ON `event`.`id` = `event->users->eventuser`.`eventid`
ORDER BY `event`.`starttime` ASC;
subQuery: false
SELECT `booking`.`id`,
`booking`.`totalprice`,
`event`.`id` AS `event.id`,
`event`.`title` AS `event.title`,
`event`.`description` AS `event.description`,
`event`.`starttime` AS `event.startTime`,
`event`.`endtime` AS `event.endTime`,
`event->users`.`id` AS `event.users.id`,
`event->users`.`email` AS `event.users.email`
FROM `bookings` AS `booking`
LEFT OUTER JOIN `events` AS `event`
ON `booking`.`eventid` = `event`.`id`
LEFT OUTER JOIN ( `eventusers` AS `event->users->eventuser`
INNER JOIN `users` AS `event->users`
ON `event->users`.`id` =
`event->users->eventuser`.`userid`)
ON `event`.`id` = `event->users->eventuser`.`eventid`
ORDER BY `event`.`starttime` ASC
LIMIT 0, 6;
associations
Booking.belongsTo(User);
Booking.belongsTo(Event);
User.belongsToMany(Event, {
through: { model: EventUsers, unique: false },
foreignKey: 'userId',
});
Event.belongsToMany(User, {
through: { model: EventUsers, unique: false },
foreignKey: 'eventId',
});
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
