2014-09-06 53 views
4

我的車型有:我如何通過3個表和Sequelize做一個組?

module.exports = function(sequelize, DataTypes) { 
    var CommitFileStatistic; 
    return CommitFileStatistic = sequelize.define('CommitFileStatistic', { 
    additions: { 
     type: DataTypes.INTEGER, 
     allowNull: false 
    }, 
    deletions: { 
     type: DataTypes.INTEGER, 
     allowNull: false 
    }, 
    status: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    fileSize: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    levenshteinDelta: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    fileHash: { 
     type: DataTypes.STRING, 
     allowNull: true 
    } 
    }, { 
    classMethods: { 
     associate: function(models) { 
     CommitFileStatistic.belongsTo(models.Commit); 
     return CommitFileStatistic.belongsTo(models.SourceFile); 
     } 
    } 
    }); 
}; 

module.exports = function(sequelize, DataTypes) { 
    var SourceFile; 
    return SourceFile = sequelize.define('SourceFile', { 
    filename: { 
     type: DataTypes.STRING, 
     allowNull: false 
    } 
    }, { 
    classMethods: { 
     associate: function(models) { 
     return SourceFile.belongsTo(models.Repository); 
     } 
    } 
    }); 
}; 

module.exports = function(sequelize, DataTypes) { 
    var Commit; 
    return Commit = sequelize.define('Commit', { 
    sha: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    commitTime: { 
     type: DataTypes.INTEGER, 
     allowNull: false 
    }, 
    message: { 
     type: DataTypes.TEXT, 
     allowNull: false 
    }, 
    isParsed: { 
     type: DataTypes.BOOLEAN, 
     allowNull: false, 
     defaultValue: false 
    } 
    }, { 
    classMethods: { 
     associate: function(models) { 
     Commit.hasMany(models.Branch); 
     return Commit.hasMany(models.Commit, { 
      as: 'Parent', 
      through: 'ParentCommit' 
     }); 
     } 
    } 
    }); 
}; 

我想要做一個查詢,就基本上做到:SELECT COUNT(*) AS fileCount, sf.* FROM CommitFileStatistics cfs, Commits c, SourceFiles sf WHERE cfs.CommitId = c.id AND cfs.SourceFileId = sf.id AND c.RepositoryId = 2 GROUP BY cfs.SourceFileId ORDER BY fileCount DESC但我想使用ORM代替原始查詢。這可能嗎?

回答

6

像這樣的事情應該是你在找什麼:

return CommitFileStatistic.findAll({ 
    attributes: [[Sequelize.fn('COUNT', '*'), 'fileCount']], 
    include: [ 
    { model: Commit, attributes: [] }, 
    { model: SourceFile, attributes: [] } 
    ], 
    group: ['SourceFileId'], 
    order: [['fileCount', 'DESC']] 
}); 

這將導致在下面的查詢:

SELECT 
    `CommitFileStatistic`.`id`, 
    COUNT('*') AS `fileCount`, 
    `Commit`.`id` AS `Commit.id`, 
    `SourceFile`.`id` AS `SourceFile.id` 
FROM 
    `commit_file_statistics` AS `CommitFileStatistic` 
LEFT OUTER JOIN `commits` AS `Commit` 
    ON `Commit`.`id` = `CommitFileStatistic`.`CommitId` 
LEFT OUTER JOIN `source_files` AS `SourceFile` 
    ON `SourceFile`.`id` = `CommitFileStatistic`.`SourceFileId` 
GROUP BY `SourceFileId` 
ORDER BY `fileCount` DESC; 

這可能只會在sequelize版本工作2.0 :)