Sequelize.js使用hasMany连接两次表

我正在使用Sequelize.js在同一个表上执行双连接。 我有一组Team对象和一组Game对象。 一个团队有许多游戏,所以它会在游戏桌上有外键,但是在每个游戏中都有两个团队,所以我需要两次join表格。 什么是使用序列化ORM来做到这一点的最好方法。

Team = sequelize.define('teams',{ name : Sequelize.STRING, location : Sequelize.STRING, }); Game = sequelize.define('games',{ homeTeamId : Sequelize.INTEGER, awayTeamId : Sequelize.INTEGER, location : Sequelize.STRING, }); // Associations Game.hasOne(Team, {foreignKey : 'homeTeamId'}); .hasOne(Team, {foreignKey : 'awayTeamId'}); Team.hasMany(Game); 

谢谢!

这实际上是一个有争议的问题。 这在当前的续集中是不被支持的,但它绝对是可行的。 我已经概述了两种方法:

 var Sequelize = require('./index'); var sequelize = new Sequelize('sequelize_test', 'root', null, { host: "127.0.0.1", port: 3306 }); var Team = sequelize.define('teams',{ name : Sequelize.STRING, location : Sequelize.STRING }, { instanceMethods: { getGamesOne: function () { var chainer = new Sequelize.Utils.QueryChainer(); chainer.add(this.getHomeGames()); chainer.add(this.getAwayGames()); return new Sequelize.Utils.CustomEventEmitter(function (emitter) { chainer.run().done(function (err, results) { var home = results[0], away = results[1]; if (err) emitter.emit('error', err) else emitter.emit('success', home.concat(away)); }); }).run(); }, getGamesTwo: function () { return Game.findAll({ where: ["homeTeamId = ? OR awayTeamId = ?", this.id, this.id ]}) } } }); var Game = sequelize.define('games',{ homeTeamId : Sequelize.INTEGER, awayTeamId : Sequelize.INTEGER, location : Sequelize.STRING }); // Associations Game.belongsTo(Team, {foreignKey : 'homeTeamId'}) .belongsTo(Team, {foreignKey : 'awayTeamId'}); Team.hasMany(Game, { as: 'AwayGames', foreignKey : 'awayTeamId'}); Team.hasMany(Game, { as: 'HomeGames', foreignKey : 'homeTeamId'}); Team.find(1).done(function (err, team) { team.getGamesOne().done(function(err, games) { console.log(games); }); team.getGamesTwo().done(function(err, games) { console.log(games); }); }) 

GetGamesOne使用sequelize的关联来分别获取主场比赛和客场比赛,并join之前返回给你。 GetGamesTwo手动build立一个查询,所以你只能跟DB聊一次。 select一个你喜欢的 – 在一个可能不是很清楚发生了什么,但是你正在使用sequelize来build立查询,所以即使你稍后改变键的名字仍然会工作。 二是非常简短明了,但你必须自己处理查询。

我也改变了你的关系从游戏到团队到belongsTo – 这意味着外键在游戏桌上。

玩得开心使用Sequelize 😉

Interesting Posts