在限制结果和包含相关模型时,我遇到了Sequelize的问题。
以下产生正确的结果,受10限制并正确排序。
Visit.findAll({
limit: 10,
order: 'updatedAt DESC',
}).success(function(visits) {
res.jsonp(visits);
}).failure(function(err) {
res.jsonp(err);
})
SQL
SELECT * FROM `Visits` ORDER BY updatedAt DESC LIMIT 10;
然而,当我添加一个关联时,它突然限制了子查询,因此排序从未发生,因为结果集有限。
Visit.findAll({
limit: 10,
order: 'updatedAt DESC',
include: [
{ model: Account, required: true }
]
}).success(function(visits) {
res.jsonp(visits);
}).failure(function(err) {
res.jsonp(err);
})
SQL
SELECT
`Visits`.*
FROM
(SELECT
`Visits`.*, `Account`.`id` AS `Account.id`, `Account`.`email` AS `Account.email`, `Account`.`password` AS `Account.password`, `Account`.`role` AS `Account.role`, `Account`.`active` AS `Account.active`, `Account`.`createdAt` AS `Account.createdAt`, `Account`.`updatedAt` AS `Account.updatedAt`, `Account`.`practice_id` AS `Account.practice_id`
FROM
`Visits` INNER JOIN `Accounts` AS `Account` ON `Account`.`id` = `visits`.`account_id` LIMIT 10) AS `visits`
ORDER BY updatedAt DESC;
我期待的是对顶级查询的限制如此:
SELECT
...
FROM
(SELECT ...) AS `Visits`
ORDER BY `Visits`.updatedAt DESC LIMIT 10
LIMIT 10;
答案 0 :(得分:4)
您不应在订单的单个字符串中同时使用键和方向。来自docs:
'用户名DESC', //将返回
username DESC
- 即不要这样做!
正确的解决方案是:
order: ['updatedAt', 'DESC']
完整的工作示例:
'use strict';
var Sequelize = require('sequelize');
var sequelize = new Sequelize(
'test', // database
'test', // username
'test', // password
{
host: 'localhost',
dialect: 'postgres'
}
);
var Customer = sequelize.define('Customer', {
firstName: {type: Sequelize.STRING},
lastName: {type: Sequelize.STRING}
});
var Order = sequelize.define('Order', {
amount: {type: Sequelize.FLOAT}
});
var firstCustomer;
Customer.hasMany(Order, {constraints: true});
Order.belongsTo(Customer, {constraints: true});
sequelize.sync({force: true})
.then(function () {
return Customer.create({firstName: 'Test', lastName: 'Testerson'});
})
.then(function (author1) {
firstCustomer = author1;
return Order.create({CustomerId: firstCustomer.id, amount: 10});
})
.then(function () {
return Order.create({CustomerId: firstCustomer.id, amount: 20})
})
.then(function () {
return Order.findAll({
limit: 10,
include: [Customer],
order: [
['updatedAt', 'DESC']
]
});
})
.then(function displayResults(results) {
results.forEach(function (c) {
console.dir(c.toJSON());
});
})
.then(function () {
process.exit(0);
});
产地:
SELECT "Order"."id", "Order"."amount", "Order"."createdAt", "Order"."updatedAt", "Order"."CustomerId", "Customer"."id" AS "Customer.id", "Customer"."firstName" AS "Customer.firstName", "Customer"."lastName" AS "Customer.lastName", "Customer"."createdAt" AS "Customer.createdAt", "Customer"."updatedAt" AS "Customer.updatedAt" FROM "Orders" AS "Order" LEFT OUTER JOIN "Customers" AS "Customer" ON "Order"."CustomerId" = "Customer"."id" ORDER BY "Order"."updatedAt" DESC LIMIT 10;
答案 1 :(得分:0)
order: ['FieldOrder', 'DESC']
例如:
db.ModelA.findAll({
include: [{
model: db.ModelB
}],
order: ['CreatedDateModelA', 'DESC']
})
.then(function(response){
}, function(err){
})
order: [ModelInclude,'FieldOrder', 'DESC']
前:
db.ModelA.findAll({
include: [{
model: db.ModelB
}],
order: [db.ModelB,'CreatedDateModelA', 'DESC']
})
.then(function(response){
}, function(err){
})