2015-01-27 17 views
9

शामिल हैं मुझे परिणामों को सीमित करते समय और संबंधित मॉडल समेत Sequelize के साथ समस्या है।सीक्वेलिज़ सीमा में एसोसिएशन

निम्नलिखित सही परिणाम उत्पन्न करता है, 10 तक सीमित और सही ढंग से क्रमबद्ध किया जाता है।

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

एसक्यूएल

SELECT * FROM `Visits` ORDER BY updatedAt DESC LIMIT 10; 

हालांकि जब मैं बजाय और इस तरह सबक्वेरी पर एक संघ यह suddently सीमा को जोड़ने के आदेश कभी नहीं एक सीमित परिणाम सेट की वजह से होता है।

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

एसक्यूएल

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; 

उत्तर

3

आप दोनों कुंजी और दिशा उपयोग नहीं करना चाहिए आपके आदेश पर एक ही स्ट्रिंग में। 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; 
+0

मैं ऊपर और अगर के रूप में मैं ऊपर की कोशिश में एक ही समस्या है समाधान यह क्लॉ द्वारा एक आदेश जोड़ता है सबकुछ और इसके बाहर दोनों में से। सबक्वायरी के बाहर 'अज्ञात कॉलम ... क्रम में खंड' की त्रुटि के साथ विफल रहता है। – adrianvlupu

+1

यह सुनिश्चित नहीं है कि यह स्वीकार्य उत्तर क्यों है, भले ही 'ऑर्डर' में वास्तव में कोई समस्या हो। सबक्वायरी से बचने के लिए और अंत में LIMIT को रखने के लिए, आपको या तो findAll ({subQuery: false, ...}), या findAll ({include: {duplicating: false, ...}) को कॉल करने की आवश्यकता है। यह भी देखें https://stackoverflow.com/questions/26021965/sequelize-with-nodejs-cant-join-tables-with-limit –

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){ 

}) 
संबंधित मुद्दे