2015-01-29 14 views
17

में अनुक्रमित करें और इसमें पोस्टग्रेएसक्यूएल डेटाबेस, अनुबंध और भुगतान पर दो टेबल हैं। एक अनुबंध में कई भुगतान किए गए हैं।समूह का उपयोग करके

मैं दो निम्नलिखित मॉडल हो रही है:

module.exports = function(sequelize, DataTypes) { 
    var contracts = sequelize.define('contracts', { 
    id: { 
     type: DataTypes.INTEGER, 
     autoIncrement: true 
    } 
    }, { 
    createdAt: false, 
    updatedAt: false, 
    classMethods: { 
     associate: function(models) { 
     contracts.hasMany(models.payments, { 
      foreignKey: 'contract_id' 
     }); 
     } 
    } 
    }); 


    return contracts; 
}; 

module.exports = function(sequelize, DataTypes) { 
    var payments = sequelize.define('payments', { 
    id: { 
     type: DataTypes.INTEGER, 
     autoIncrement: true 
    }, 
    contract_id: { 
     type: DataTypes.INTEGER, 
    }, 
    payment_amount: DataTypes.INTEGER, 
    }, { 
    classMethods: { 
     associate: function(models) { 
     payments.belongsTo(models.contracts, { 
      foreignKey: 'contract_id' 
     }); 
     } 
    } 
    }); 


    return payments; 
}; 

मैं सभी हर अनुबंध के लिए किए गए भुगतान योग करने के लिए चाहते हैं, और इस समारोह का प्रयोग किया:

models.contracts.findAll({ 
    attributes: [ 
     'id' 
    ], 
    include: [ 
    { 
     model: models.payments, 
     attributes: [[models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']] 
    } 
    ], 
    group: ['contracts.id'] 
}) 

लेकिन यह निम्नलिखित उत्पन्न करता है क्वेरी:

SELECT "contracts"."id", "payments"."id" AS "payments.id", sum("payments"."payment_amount") AS "payments.total_cost" 
FROM "contracts" AS "contracts" 
LEFT OUTER JOIN "payments" AS "payments" ON "contracts"."id" = "payments"."contract_id" GROUP BY "contracts"."id"; 

मैं क्योंकि मैं इसे शामिल करने के लिए होगा, payments.id चयन करने के लिए मत पूछो मेरे समेकन या समूह द्वारा कार्यों में, जैसा कि मैंने कहा है:

Possibly unhandled SequelizeDatabaseError: error: column "payments.id" must appear in the GROUP BY clause or be used in an aggregate function

क्या मुझे यहां कुछ याद आ रही है? मैं this answer का पालन कर रहा हूं लेकिन यहां तक ​​कि मुझे समझ में नहीं आता कि SQL अनुरोध मान्य कैसे हो सकता है।

उत्तर

12

यह समस्या Sequelize 3.0.1 पर तय किया गया है, शामिल मॉडल की प्राथमिक कुंजी

साथ बाहर रखा जाना चाहिए
attributes: [] 

और कुल मिलाकर मुख्य मॉडल (this github issue में इंफोसेशन) पर एकत्रीकरण किया जाना चाहिए।

अपने प्रयोग के मामले के लिए इस प्रकार

, कोड निम्न

models.contracts.findAll({ 
    attributes: ['id', [models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']], 
    include: [ 
    { 
     model: models.payments, 
     attributes: [] 
    } 
    ], 
    group: ['contracts.id'] 
}) 
1

क्या समस्या है कि आप payments से चयन करना चाहते हैं और contracts से दूसरे तरीके के बजाय इसमें शामिल होना चाहते हैं?

1

आप के रूप में

models.contracts.findAll({ 
    attributes: [ 
     'models.contracts.id' 
    ], 
    include: [ 
    { 
     model: models.payments, 
     attributes: [[models.sequelize.fn('sum', models.sequelize.col('payments.payment_amount')), 'total_cost']] 
    } 
    ], 
    group: ['contracts.id'] 
}) 
+0

आप के बजाय 'models.contracts.id' का मतलब है 'contracts.id' है? वैसे भी पहला मुझे एक ही त्रुटि देता है और दूसरा एक और एसक्यूएल त्रुटि फेंकता है (खंड से गायब)। – syldor

1

अपने समारोह लिख सकते हैं की कोशिश करो

group: ['contracts.id', 'payments.id'] 
+0

धन्यवाद लेकिन अगर मैं 'payments.id' द्वारा समूहित करता हूं तो मैं भुगतान.payment_amount को पूरा नहीं कर पाऊंगा। – syldor

+0

कैसे 'गुण': ['payment_amount', [models.sequelize.fn ('sum', models.sequelize.col ('payments.payment_amount')), 'total_cost']]]। मूल रूप से अनुक्रमित होने पर आईडी का चयन किया जाएगा यदि "कुछ भी नहीं" चुना गया है। अगर यह काम करता है तो मैं अपना जवाब अपडेट करूंगा। उम्मीद है कि यह करता है। – Calvintwr

+0

दुर्भाग्यवश, हमेशा एक ही त्रुटि: 'संभावित रूप से अनचाहे SequelizeDatabaseError: कॉलम "payments.id" ग्रुप बाय क्लॉज में दिखाई देना चाहिए या एक समग्र फ़ंक्शन में उपयोग किया जाना चाहिए' – syldor

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