2015-04-25 6 views
11

In Rails zählen kann ich eine einfache ORM-Abfrage für die Anzahl der Likes ein Modell hat durchführen:Wie eine Gruppe von Abfrage in NodeJS Sequelize

@records = Model 
     .select('model.*') 
     .select('count(likes.*) as likes_count') 
     .joins('LEFT JOIN likes ON model.id = likes.model_id') 
     .group('model.id') 

Dies erzeugt die Abfrage:

SELECT models.*, count(likes.*) as likes_count 
FROM "models" JOIN likes ON models.id = likes.model_id 
GROUP BY models.id 

in Knoten Sequelize, bei jedem Versuch, etwas ähnliches zu tun versagt:

return Model.findAll({ 
    group: [ '"Model".id' ], 
    attributes: ['id', [Sequelize.fn('count', Sequelize.col('"Likes".id')), 'likes_count']], 
    include: [{ attributes: [], model: Like }], 
}); 

Dadurch wird die Abfrage generiert:

SELECT 
    Model.id, 
    count(Likes.id) AS likes_count, 
    Likes.id AS Likes.id   # Bad! 
FROM Models AS Model 
LEFT OUTER JOIN Likes 
    AS Likes 
    ON Model.id = Likes.model_id 
GROUP BY Model.id; 

, die den Fehler erzeugt:

column "Likes.id" must appear in the GROUP BY clause or be used in an aggregate function 

Es Auswahl fälschlicherweise likes.id, und ich habe keine Ahnung, warum, noch wie es loszuwerden.

+0

immer die ID eines verbundenen Modell Auswahl einer sequelize Technisierung ist, und kann nicht deaktiviert werden. Versuchen Sie likes.id zu Ihrer Gruppenklausel hinzuzufügen –

+2

Die Antwort auf diese Frage, die von einem Mod gelöscht wurde, ist nicht Sequelize verwenden. Es erzeugt häufig ungültiges SQL, das die Abfrage stürzt (Sie hatten einen Job). Knex Query Builder ist ein viel besseres Werkzeug, das die gleiche Lichtabstraktion um Sql bietet, die Schienen tut. Sql ist schon eine gute Abstraktion, lass Sequelize es nicht schlimmer für dich machen. –

+0

@ andy-ray welche Version von Sequelize ...? – Satyajeet

Antwort

8

This sequelize github issue ganz wie Ihr Fall aussieht:

User.findAll({ 
    attributes: ['User.*', 'Post.*', [sequelize.fn('COUNT', 'Post.id'), 'PostCount']], 
    include: [Post] 
}); 
4

dieses Problem beheben wir auf die neueste Version von sequelize aktualisieren müssen und sind roh = true, Hier ist, wie ich nach viel Iteration getan hatte, und aus -Gang googeln.

getUserProjectCount: function (req, res) { 
     Project.findAll(
      { 
       attributes: ['User.username', [sequelize.fn('COUNT', sequelize.col('Project.id')), 'ProjectCount']], 
       include: [ 
        { 
         model: User, 
         attributes: [], 
         include: [] 
        } 
       ], 
       group: ['User.username'], 
       raw:true 
      } 
     ).then(function (projects) { 
      res.send(projects); 
     }); 
    } 

wo meine Referenzmodelle sind

//user 
var User = sequelize.define("User", { 
    username: Sequelize.STRING, 
    password: Sequelize.STRING 
}); 

//project 
var Project = sequelize.define("Project", { 
    name: Sequelize.STRING, 
    UserId:{ 
     type:Sequelize.INTEGER, 
     references: { 
       model: User, 
        key: "id" 
     } 
    } 
}); 

Project.belongsTo(User); 
User.hasMany(Project); 

nach ORM Migration 'Benutzer' & 'Projekte' Tabelle in meine Postgres-Server erstellen. Hier SQL Query von ORM

SELECT 
    "User"."username", COUNT("Project"."id") AS "ProjectCount" 
FROM 
    "Projects" AS "Project" 
    LEFT OUTER JOIN "Users" AS "User" ON "Project"."UserId" = "User"."id" 
GROUP BY 
    "User"."username"; 
+3

Ich denke, das ist ein großartiges Beispiel dafür, warum man Sequelize um jeden Preis vermeiden sollte. Es ist nicht nur eine undichte Abstraktion über SQL, sie erfinden ihre eigenen Nonsense-Abstraktionen, um ihre eigene Software zu reparieren, wie "roh": wahr. SQL ist bereits eine feine Abstraktion, Sequelize bringt nur neue Bugs hinzu. –

+0

+1 für einen Hinweis mit "roh = wahr". Ohne das, meine Sequelize (Version 3.27.0) war verrückt. Einfaches Beispiel: 'model.findAll \t \t \t Attribute: [ 'name', sequelize.fn ('Summe', sequelize.col ('value'))] \t \t \t Gruppe: [ 'name'] ' outputed Struktur gruppiert von" Name "(das ist ok), aber anstelle der Summe (Wert) gab es einige andere dritte Spalte, absolut nicht verwandt. – venca163

Verwandte Themen