Подсчет связанных записей с Sequelize

У меня есть две таблицы, locations и sensors. Каждая запись в sensors имеет внешний ключ, указывающий на locations. Используя Sequelize, как мне получить все записи из locations и общее количество записей в sensors, которые связаны с каждой записью в locations?

Необработанный 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;
};

Ответ 1

Используйте 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']
})

Ответ 2

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

и он работает. но когда я добавляю "предел", я получил ошибку: датчики undefined

Ответ 3

У меня есть три модели учитель (идентификатор, имя), курс (идентификатор, имя) и assign_teacher (курс) (id, course_id, teacher_id), и у меня есть много ко многим курсам отношений, принадлежащих многим учителям через assign_teacher, и учитель принадлежит ко многим курсам через assign_teacher и assign_teacher принадлежат учителю и курсу, и я хочу получить всех учителей вместе с не назначенными курсами, и все учителя, которым назначен хотя бы один курс, могут помочь любому телу, пожалуйста, для продолжения запроса