2015-01-29 16 views
17

Tôi có hai bảng trên cơ sở dữ liệu, hợp đồng và thanh toán PostgreSQL. Một hợp đồng đã thực hiện nhiều khoản thanh toán.Sử dụng nhóm theo và tham gia trong phần tiếp theo

Tôi đang gặp hai mô hình sau:

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; 
}; 

Tôi muốn tổng hợp tất cả các khoản thanh toán được thực hiện cho tất cả các hợp đồng và sử dụng chức năng này:

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'] 
}) 

Nhưng nó tạo ra như sau truy vấn:

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"; 

Tôi không yêu cầu chọn thanh toán.id, vì tôi sẽ phải bao gồm nó trong tập hợp hoặc nhóm của tôi theo chức năng, như đã nói trong lỗi tôi có:

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

Tôi có thiếu gì đó ở đây không? Tôi đang theo dõi this answer nhưng ngay cả ở đó tôi cũng không hiểu cách yêu cầu SQL có thể hợp lệ.

Trả lời

12

Vấn đề này đã được cố định trên Sequelize 3.0.1, khóa chính của các mô hình bao gồm phải được loại trừ với

attributes: [] 

và việc tổng hợp phải được thực hiện trên mô hình chính (thông tin trong this github issue).

Như vậy đối với trường hợp sử dụng của tôi, mã này là những sản phẩm sau

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

Vấn đề bạn có thể muốn chọn từ payments và tham gia contracts thay vì theo cách khác?

1

Bạn có thể viết hàm của bạn như

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

Ý của bạn là 'contracts.id' thay vì 'models.contracts.id'? Dù sao cái đầu tiên mang lại cho tôi cùng một lỗi và cái thứ hai ném một lỗi SQL khác (thiếu mệnh đề FROM). – syldor

1

Hãy thử

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

Xin cảm ơn nhưng nếu tôi nhóm theo 'payments.id', tôi sẽ không thể tính số tiền payments.payment_amount. – syldor

+0

Cách bout 'thuộc tính: [' payment_amount ', [models.sequelize.fn (' sum ', models.sequelize.col (' payments.payment_amount ')),' total_cost ']] '. Về cơ bản, phần tiếp theo sẽ chọn id nếu "không có gì" được chọn. Nếu điều đó hoạt động, tôi sẽ cập nhật câu trả lời của mình. Hy vọng nó. – Calvintwr

+0

Thật không may, luôn luôn lỗi tương tự: 'Có thể unhandled SequelizeDatabaseError: cột" payments.id "phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp' – syldor

Các vấn đề liên quan