续集限制包括关联

Fra*_*sen 10 javascript mysql sequelize.js

在限制结果和包括相关模型时,我遇到了Sequelize的问题.

以下产生正确的结果,限制为10并正确排序.

Visit.findAll({
  limit: 10,
  order: 'updatedAt DESC',
}).success(function(visits) {
  res.jsonp(visits);
}).failure(function(err) {
  res.jsonp(err);
})
Run Code Online (Sandbox Code Playgroud)

SQL

SELECT * FROM `Visits` ORDER BY updatedAt DESC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

但是当我添加一个关联时,它突然限制了子查询,因此排序从未发生,因为结果集有限.

Visit.findAll({
  limit: 10,
  order: 'updatedAt DESC',
  include: [
    { model: Account, required: true }
  ]
}).success(function(visits) {
  res.jsonp(visits);
}).failure(function(err) {
  res.jsonp(err);
})
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

我期待的是对顶级查询的限制如下:

SELECT 
  ...
FROM 
  (SELECT ...) AS `Visits`
ORDER BY `Visits`.updatedAt DESC LIMIT 10
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

srl*_*rlm 5

您不应在订单的单个字符串中同时使用键和方向。从文档

'username DESC', // 会返回username DESC——即不要这样做!

正确的解决办法是:

order: ['updatedAt', 'DESC']
Run Code Online (Sandbox Code Playgroud)

完整的工作示例:

order: ['updatedAt', 'DESC']
Run Code Online (Sandbox Code Playgroud)

产生:

'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);
    });
Run Code Online (Sandbox Code Playgroud)