2016-06-14 39 views
4

我有兩個表,locationssensorssensors中的每個條目都有一個指向locations的外鍵。使用Sequelize,如何獲得locations中的所有條目以及sensors中與locations中的每個條目相關聯的條目總數?用Sequelize計算相關條目

原始SQL:

SELECT 
    `locations`.*, 
    COUNT(`sensors`.`id`) AS `sensorCount` 
FROM `locations` 
JOIN `sensors` ON `sensors`.`location`=`locations`.`id`; 
GROUP BY `locations`.`id`; 

型號:

module.exports = function(sequelize, DataTypes) { 
    var Location = sequelize.define("Location", { 
     id: { 
      type: DataTypes.INTEGER.UNSIGNED, 
      primaryKey: true 
     }, 
     name: DataTypes.STRING(255) 
    }, { 
     classMethods: { 
      associate: function(models) { 
       Location.hasMany(models.Sensor, { 
        foreignKey: "location" 
       }); 
      } 
     } 
    }); 

    return Location; 
}; 


module.exports = function(sequelize, DataTypes) { 
    var Sensor = sequelize.define("Sensor", { 
     id: { 
      type: DataTypes.INTEGER.UNSIGNED, 
      primaryKey: true 
     }, 
     name: DataTypes.STRING(255), 
     type: { 
      type: DataTypes.INTEGER.UNSIGNED, 
      references: { 
       model: "sensor_types", 
       key: "id" 
      } 
     }, 
     location: { 
      type: DataTypes.INTEGER.UNSIGNED, 
      references: { 
       model: "locations", 
       key: "id" 
      } 
     } 
    }, { 
     classMethods: { 
      associate: function(models) { 
       Sensor.belongsTo(models.Location, { 
        foreignKey: "location" 
       }); 

       Sensor.belongsTo(models.SensorType, { 
        foreignKey: "type" 
       }); 
      } 
     } 
    }); 

    return Sensor; 
}; 
+0

那實際上是你想要的SQL嗎?我認爲這不會做你認爲會的事。事實上,我不確定這個查詢會在沒有發生錯誤的情況下運行。 – dvlsg

+0

@dvlsg我運行它,它正確地返回'locations'表中的所有行和字段,並且每行都有'sensors'中相關條目的正確數目。 – MikkoP

+0

其實@dvlsg,這是不對的。我做了一些更多的測試(在'locations'表中有更多的條目),結果我忘記了一個「GROUP BY」語句。我編輯了這個問題。 – MikkoP

回答

7

使用findAll()include()sequelize.fn()COUNT

Location.findAll({ 
    attributes: { 
     include: [[Sequelize.fn("COUNT", Sequelize.col("sensors.id")), "sensorCount"]] 
    }, 
    include: [{ 
     model: Sensor, attributes: [] 
    }] 
}); 

或者,您可能需要添加一個group作爲好吧:

Location.findAll({ 
    attributes: { 
     include: [[Sequelize.fn("COUNT", Sequelize.col("sensors.id")), "sensorCount"]] 
    }, 
    include: [{ 
     model: Sensor, attributes: [] 
    }], 
    group: ['Location.id'] 
}) 
+0

感謝您的回答。這正確計數'sensourCount'字段,但它也包含來自結果中'sensors'表的字段。另外,雖然它執行的SQL查詢顯示它包含位置表中的所有字段,但它們不包含在結果中(它在'then'子句中返回的對象)。 – MikkoP

+0

@MikkoP好吧,讓我快速構建一個示例和調試,謝謝。 – alecxe

+0

@MikkoP你能否編輯這個問題併發布你的模型定義?謝謝。 – alecxe