Le titre est réécrit comme suit : Utilisez Sequelize pour compter le nombre de lignes dans les tables liées.
P粉792026467
P粉792026467 2023-08-27 22:35:45
0
1
400
<p>En utilisant sequelize et MySQL, j'ai deux tables : <code>User</code> et <code>Post</code>. </p> <p>La relation entre les deux tables est <code>M:N</code></p> <pre class="brush:php;toolbar:false;">db.User.belongsToMany(db.Post, { through: "J'aime", as: "J'aime" }); db.Post.belongsToMany(db.User, { through : "Likes", as : "Likers" });</pre> <p>Ce que je veux, c'est obtenir tous les identifiants des likes et le nombre de likes de la publication. </p> <p>Je sais que vous pouvez obtenir <code>tous les likes</code> </p> <pre class="brush:php;toolbar:false;">const post = wait Post.findOne({ où : { id : postId }, attributs : ["id", "title", "imageUrl"], inclure: [{ modèle: Utilisateur, comme : "Likers", attributs : ["id"], à travers : { attributs : [] }, }] }) // résultat { "identifiant": 36, "titre": "test", "imageUrl": "하늘이_1644886996449.jpg", "J'aime": [ { "identifiant": 13 }, { "identifiant": 16 } ] }</pré> <p>De plus, je sais aussi que je peux obtenir le <code>nombre de likes</code> </p> <pre class="brush:php;toolbar:false;">const post = wait Post.findOne({ où : { id : postId }, attributs : ["id", "title", "imageUrl"], inclure: [{ modèle: Utilisateur, comme : "Likers", attributs : [[sequelize.fn("COUNT", "id"), "likersCount"]], }] }) // résultat { "identifiant": 36, "titre": "test", "imageUrl": "하늘이_1644886996449.jpg", "J'aime": [ { "likersCount": 2 } ] }</pré> <p>Cependant, je ne sais pas comment obtenir les deux en même temps. Vérifiez les résultats lorsque je les utilise tous les deux. </p> <pre class="brush:php;toolbar:false;">{ modèle: Utilisateur, comme : "Likers", attributs : ["id", [sequelize.fn("COUNT", "id"), "likersCount"]], à travers : { attributs : [] }, } // résultat "J'aime": [ { "identifiant": 13, "likersCount": 2 } ]≪/pré> <p>Il ne montre qu'un seul like (id : 13) Il devrait montrer un autre like (id : 16). </p> <p>Quel est le problème ? </p>
P粉792026467
P粉792026467

répondre à tous(1)
P粉193307465

Il n'en affiche qu'un car COUNT est une fonction d'agrégation qui regroupe les enregistrements pour les compter. Ainsi, la seule façon d'obtenir les deux est d'utiliser une sous-requête, de compter le nombre d'enregistrements dans la table de jointure et d'obtenir simultanément les enregistrements de l'autre côté de la relation M:N.

const post = await Post.findOne({
  where: { id: postId },
  attributes: ["id", "title", "imageUrl", 
  // 你可能需要更正表和字段的名称
  [Sequelize.literal('(SELECT COUNT(*) FROM Likes where Likes.postId=Post.id)'), 'LikeCount']],
  include: [{
    model: User,
    as: "Likers",
    attributes: ["id"],
    through: { attributes: [] },
  }]
})
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal