Подсчет связанных записей с 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 принадлежат учителю и курсу, и я хочу получить всех учителей вместе с не назначенными курсами, и все учителя, которым назначен хотя бы один курс, могут помочь любому телу, пожалуйста, для продолжения запроса