Le comptage des entrées associées avec Sequelize
J'ai deux tables, locations
et sensors
. Chaque entrée dans sensors
a une clé étrangère pointant vers locations
. À l'aide de Sequelize, comment puis-je obtenir toutes les entrées de locations
et le nombre total d'entrées dans sensors
qui sont associés à chaque entrée dans locations
?
SQL brut:
SELECT
`locations`.*,
COUNT(`sensors`.`id`) AS `sensorCount`
FROM `locations`
JOIN `sensors` ON `sensors`.`location`=`locations`.`id`;
GROUP BY `locations`.`id`;
Modèles:
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;
};
Est-ce réellement le
Je le lance et il retournés correctement toutes les lignes et les champs dans la
En fait @dvlsg, il n'est pas droit. J'ai fait quelques tests supplémentaires (avec plus d'entrées dans
Ah, d'accord. Cela fait plus de sens. J'ai pensé que peut-être que MySQL a été tirant quelques manigances, je n'étais pas au courant (et je le sais, ils le font avec les
stackoverflow.com/questions/52496842/...
SQL
que vous voulez? Je ne pense pas que cela va faire ce que vous pensez qu'il sera. En fait, je ne suis pas sûr que la requête s'exécute sans jeter une erreur.Je le lance et il retournés correctement toutes les lignes et les champs dans la
locations
tableau et pour chaque ligne le nombre d'entrées associées dans sensors
.En fait @dvlsg, il n'est pas droit. J'ai fait quelques tests supplémentaires (avec plus d'entrées dans
locations
table) et il s'est avéré que j'avais oublié un GROUP BY
déclaration. J'ai édité la question.Ah, d'accord. Cela fait plus de sens. J'ai pensé que peut-être que MySQL a été tirant quelques manigances, je n'étais pas au courant (et je le sais, ils le font avec les
GROUP
états, de sorte qu'il n'était pas tout à fait déraisonnable).stackoverflow.com/questions/52496842/...
OriginalL'auteur MikkoP | 2016-06-14
Vous devez vous connecter pour publier un commentaire.
Utilisation
findAll()
avecinclude()
etsequelize.fn()
pour laCOUNT
:Ou, vous pouvez avoir besoin d'ajouter un
group
ainsi:sensourCount
champ, mais il comprend aussi les champs desensors
table dans les résultats. Aussi, bien que la requête SQL s'exécute montre qu'il inclut tous les champs de lalocations
table, ils ne sont pas inclus dans le résultat (l'objet qu'il retourne dans lethen
clause).ok, permettez-moi de construire rapidement un échantillon et de débogage, merci.
pourriez-vous s'il vous plaît modifier la question et postez vos définitions de modèle? Merci.
J'ai ajouté les définitions de modèle. Voici ce que votre requête sorties. pastebin.com/PwnctW1Y
Ce n'est pas de travailler, si vous fixez une limite
OriginalL'auteur alecxe
et il fonctionne. mais quand j'ajoute de la "limite", je suis d'erreur: capteurs undefined
OriginalL'auteur Arif Fathurrohman